diff --git a/.github/detekt.yml b/.github/detekt.yml
index 5a6a836..70365a5 100644
--- a/.github/detekt.yml
+++ b/.github/detekt.yml
@@ -102,7 +102,7 @@ complexity:
excludeStringsWithLessThan5Characters: true
ignoreStringsRegex: '$^'
TooManyFunctions:
- active: true
+ active: false
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**']
thresholdInFiles: 11
thresholdInClasses: 11
diff --git a/.idea/artifacts/workflow_core_jvm_0_26_0_SNAPSHOT.xml b/.idea/artifacts/workflow_core_jvm_0_26_0_SNAPSHOT.xml
new file mode 100644
index 0000000..5b3b425
--- /dev/null
+++ b/.idea/artifacts/workflow_core_jvm_0_26_0_SNAPSHOT.xml
@@ -0,0 +1,8 @@
+
+
+ $PROJECT_DIR$/../workflow/workflow-core/build/libs
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/artifacts/workflow_runtime_jvm_0_26_0_SNAPSHOT.xml b/.idea/artifacts/workflow_runtime_jvm_0_26_0_SNAPSHOT.xml
new file mode 100644
index 0000000..979368a
--- /dev/null
+++ b/.idea/artifacts/workflow_runtime_jvm_0_26_0_SNAPSHOT.xml
@@ -0,0 +1,9 @@
+
+
+ $PROJECT_DIR$/../workflow/workflow-runtime/build/libs
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 61a9130..ef35b0d 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -1,6 +1,16 @@
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index d8282dd..4a6b2b9 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -46,5 +46,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 73df869..ddf820b 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -1,12 +1,6 @@
plugins {
id("com.android.application")
kotlin("android")
- kotlin("kapt")
-}
-
-kapt {
- correctErrorTypes = true
- useBuildCache = true
}
val isCI = System.getenv("CI") == "true"
@@ -86,38 +80,23 @@ dependencies {
implementation(Libs.kotlinStd)
implementation(Libs.materialDesign)
implementation(Libs.androidXCore)
-
+ implementation(Libs.Kotlinx.datetime)
+ implementation(Libs.Kotlinx.serialization)
implementation(Libs.Compose.animation)
implementation(Libs.Compose.foundation)
implementation(Libs.Compose.foundationLayout)
implementation(Libs.Compose.material)
implementation(Libs.Compose.runtime)
implementation(Libs.Compose.ui)
-
- implementation(Libs.Workflow.core)
- implementation(Libs.Workflow.runtime)
- if (!isCI) {
- implementation(Libs.Workflow.compose)
- implementation(Libs.Workflow.composeTooling)
- } else {
- implementation("com.squareup.workflow:core-compose") {
- version {
- branch = "main"
- }
- }
- implementation("com.squareup.workflow:compose-tooling") {
- version {
- branch = "main"
- }
- }
- }
-
implementation(Libs.Koin.core)
implementation(Libs.Koin.android)
-
- implementation(Libs.Moshi.core)
- implementation(Libs.Moshi.adapters)
- implementation(Libs.Moshi.sealedAnnotations)
- kapt(Libs.Moshi.codegen)
- kapt(Libs.Moshi.sealedCodgen)
+ implementation(Libs.Workflow.runtime) {
+ version { branch = "popalay/multiplatform" }
+ }
+ implementation(Libs.Workflow.compose) {
+ version { branch = "popalay/multiplatform" }
+ }
+ implementation(Libs.Workflow.composeTooling) {
+ version { branch = "popalay/multiplatform" }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/popalay/tracktor/App.kt b/app/src/main/java/com/popalay/tracktor/App.kt
index 14a0319..e2c4cfc 100644
--- a/app/src/main/java/com/popalay/tracktor/App.kt
+++ b/app/src/main/java/com/popalay/tracktor/App.kt
@@ -2,6 +2,7 @@ package com.popalay.tracktor
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.runtime.Composable
+import com.popalay.tracktor.domain.workflow.AppWorkflow
import com.popalay.tracktor.feature.createtracker.CreateTrackerBinding
import com.popalay.tracktor.feature.featureflagslist.FeatureFlagsListBinding
import com.popalay.tracktor.feature.list.ListBinding
diff --git a/app/src/main/java/com/popalay/tracktor/DefaultApplication.kt b/app/src/main/java/com/popalay/tracktor/DefaultApplication.kt
index f932b43..0d160ba 100644
--- a/app/src/main/java/com/popalay/tracktor/DefaultApplication.kt
+++ b/app/src/main/java/com/popalay/tracktor/DefaultApplication.kt
@@ -1,19 +1,18 @@
package com.popalay.tracktor
import android.app.Application
+import com.popalay.tracktor.domain.initKoin
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
-import org.koin.core.context.startKoin
import org.koin.core.logger.Level
class DefaultApplication : Application() {
override fun onCreate() {
super.onCreate()
- startKoin {
+ initKoin {
androidContext(this@DefaultApplication)
androidLogger(Level.ERROR)
- modules(modules)
}
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/popalay/tracktor/Dependencies.kt b/app/src/main/java/com/popalay/tracktor/Dependencies.kt
deleted file mode 100644
index 9fe8c78..0000000
--- a/app/src/main/java/com/popalay/tracktor/Dependencies.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.popalay.tracktor
-
-import com.popalay.tracktor.data.dataModule
-import com.popalay.tracktor.data.featureflags.FeatureFlagsManager
-import com.popalay.tracktor.data.featureflags.RealFeatureFlagsManager
-import com.popalay.tracktor.domain.domainModule
-import com.popalay.tracktor.feature.createtracker.CreateTrackerWorkflow
-import com.popalay.tracktor.feature.featureflagslist.FeatureFlagsListWorkflow
-import com.popalay.tracktor.feature.list.ListWorkflow
-import com.popalay.tracktor.feature.settings.SettingsWorkflow
-import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow
-import org.koin.dsl.module
-
-val coreModule = module {
- single { AppWorkflow(get()) }
- single { ListWorkflow(get(), get(), get(), get(), get(), get()) }
- single { TrackerDetailWorkflow(get(), get(), get(), get()) }
- single { FeatureFlagsListWorkflow(get()) }
- single { CreateTrackerWorkflow(get(), get(), get()) }
- single { SettingsWorkflow(get()) }
-}
-
-val featureFlagsModule = module {
- single { RealFeatureFlagsManager() }
-}
-
-val modules = listOf(
- coreModule,
- domainModule,
- dataModule,
- featureFlagsModule
-)
\ No newline at end of file
diff --git a/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerScreen.kt b/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerScreen.kt
index 0bd42bf..56c0f8d 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerScreen.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerScreen.kt
@@ -33,6 +33,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.ViewAmbient
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.ui.tooling.preview.Preview
@@ -41,7 +42,9 @@ import androidx.ui.tooling.preview.PreviewParameterProvider
import com.popalay.tracktor.core.R
import com.popalay.tracktor.data.model.ProgressDirection
import com.popalay.tracktor.data.model.UnitValueType
-import com.popalay.tracktor.feature.createtracker.CreateTrackerWorkflow.Action
+import com.popalay.tracktor.domain.workflow.CreateTrackerWorkflow.Action
+import com.popalay.tracktor.domain.workflow.CreateTrackerWorkflow.Rendering
+import com.popalay.tracktor.domain.workflow.CreateTrackerWorkflow.State
import com.popalay.tracktor.success
import com.popalay.tracktor.ui.widget.Chip
import com.popalay.tracktor.ui.widget.ChipGroup
@@ -50,21 +53,21 @@ import com.popalay.tracktor.utils.imePadding
import com.popalay.tracktor.utils.onBackPressed
import com.squareup.workflow.ui.compose.composedViewFactory
-val CreateTrackerBinding = composedViewFactory { rendering, _ ->
+val CreateTrackerBinding = composedViewFactory { rendering, _ ->
onBackPressed { rendering.onAction(Action.BackClicked) }
CreateTrackerScreen(rendering.state, rendering.onAction)
}
-class CreateTrackerStatePreviewProvider : PreviewParameterProvider {
- override val values: Sequence
- get() = sequenceOf(CreateTrackerWorkflow.State())
+class CreateTrackerStatePreviewProvider : PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(State())
}
@OptIn(ExperimentalAnimationApi::class)
@Preview
@Composable
fun CreateTrackerScreen(
- @PreviewParameter(CreateTrackerStatePreviewProvider::class) state: CreateTrackerWorkflow.State,
+ @PreviewParameter(CreateTrackerStatePreviewProvider::class) state: State,
onAction: (Action) -> Unit = {}
) {
Scaffold(topBar = { CreateTrackerAppBar(onAction, state) }) {
@@ -94,7 +97,7 @@ fun CreateTrackerScreen(
@Composable
private fun CustomUnitCreator(
- state: CreateTrackerWorkflow.State,
+ state: State,
onAction: (Action) -> Unit,
modifier: Modifier = Modifier
) {
@@ -126,7 +129,7 @@ private fun CustomUnitCreator(
@Composable
private fun RowScope.CustomUnitValueTypeDropDown(
onAction: (Action) -> Unit,
- state: CreateTrackerWorkflow.State,
+ state: State,
modifier: Modifier = Modifier
) {
DropdownMenu(
@@ -158,7 +161,7 @@ private fun RowScope.CustomUnitValueTypeDropDown(
@Composable
private fun CreateTrackerAppBar(
onAction: (Action) -> Unit,
- state: CreateTrackerWorkflow.State,
+ state: State,
modifier: Modifier = Modifier
) {
TopAppBar(
@@ -184,7 +187,7 @@ private fun CreateTrackerAppBar(
@Composable
private fun TitleInput(
- state: CreateTrackerWorkflow.State,
+ state: State,
onAction: (Action) -> Unit,
modifier: Modifier = Modifier
) {
@@ -200,7 +203,7 @@ private fun TitleInput(
@Composable
private fun UnitSelector(
- state: CreateTrackerWorkflow.State,
+ state: State,
onAction: (Action) -> Unit,
modifier: Modifier = Modifier
) {
@@ -238,7 +241,7 @@ private fun UnitSelector(
@Composable
private fun DirectionSelector(
- state: CreateTrackerWorkflow.State,
+ state: State,
onAction: (Action) -> Unit,
modifier: Modifier = Modifier
) {
@@ -263,7 +266,7 @@ private fun DirectionSelector(
@Composable
private fun ValueInput(
- state: CreateTrackerWorkflow.State,
+ state: State,
onAction: (Action) -> Unit,
modifier: Modifier = Modifier
) {
@@ -271,7 +274,7 @@ private fun ValueInput(
value = state.initialValue,
label = { Text(stringResource(R.string.create_tracker_value_label)) },
onValueChange = { onAction(Action.ValueChanged(it)) },
- keyboardType = state.initialValueKeyboardType,
+ keyboardType = KeyboardType.valueOf(state.initialValueKeyboardType),
activeColor = MaterialTheme.colors.onSurface,
backgroundColor = MaterialTheme.colors.surface,
modifier = modifier.fillMaxWidth().padding(horizontal = 16.dp)
diff --git a/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListScreen.kt b/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListScreen.kt
index b6f9b06..0fbd564 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListScreen.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListScreen.kt
@@ -20,26 +20,28 @@ import androidx.ui.tooling.preview.Preview
import androidx.ui.tooling.preview.PreviewParameter
import androidx.ui.tooling.preview.PreviewParameterProvider
import com.popalay.tracktor.core.R
-import com.popalay.tracktor.feature.featureflagslist.FeatureFlagsListWorkflow.Action
+import com.popalay.tracktor.domain.workflow.FeatureFlagsListWorkflow.Action
+import com.popalay.tracktor.domain.workflow.FeatureFlagsListWorkflow.Rendering
+import com.popalay.tracktor.domain.workflow.FeatureFlagsListWorkflow.State
import com.popalay.tracktor.ui.widget.TopAppBar
import com.popalay.tracktor.utils.Faker
import com.popalay.tracktor.utils.onBackPressed
import com.squareup.workflow.ui.compose.composedViewFactory
-val FeatureFlagsListBinding = composedViewFactory { rendering, _ ->
+val FeatureFlagsListBinding = composedViewFactory { rendering, _ ->
onBackPressed { rendering.onAction(Action.BackClicked) }
FeatureFlagsListScreen(rendering.state, rendering.onAction)
}
-class FeatureFlagsListPreviewProvider : PreviewParameterProvider {
- override val values: Sequence
- get() = sequenceOf(FeatureFlagsListWorkflow.State(List(5) { Faker.fakeFeatureFlag() }))
+class FeatureFlagsListPreviewProvider : PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(State(List(5) { Faker.fakeFeatureFlag() }))
}
@Preview
@Composable
fun FeatureFlagsListScreen(
- @PreviewParameter(FeatureFlagsListPreviewProvider::class) state: FeatureFlagsListWorkflow.State,
+ @PreviewParameter(FeatureFlagsListPreviewProvider::class) state: State,
onAction: (Action) -> Unit = {}
) {
Scaffold(
diff --git a/app/src/main/java/com/popalay/tracktor/feature/list/ListScreen.kt b/app/src/main/java/com/popalay/tracktor/feature/list/ListScreen.kt
index 033cc7b..68eee7b 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/list/ListScreen.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/list/ListScreen.kt
@@ -35,8 +35,8 @@ import com.popalay.tracktor.core.R
import com.popalay.tracktor.data.model.Category
import com.popalay.tracktor.data.model.Statistic
import com.popalay.tracktor.data.model.toListItem
-import com.popalay.tracktor.feature.list.ListWorkflow.Action
-import com.popalay.tracktor.feature.list.ListWorkflow.Rendering
+import com.popalay.tracktor.domain.workflow.ListWorkflow.Action
+import com.popalay.tracktor.domain.workflow.ListWorkflow.Rendering
import com.popalay.tracktor.ui.dialog.AddNewRecordDialog
import com.popalay.tracktor.ui.widget.AllCategoryList
import com.popalay.tracktor.ui.widget.AnimatedSnackbar
@@ -102,9 +102,9 @@ fun ListScreen(
when {
rendering.itemInEditing != null -> {
AddNewRecordDialog(
- tracker = rendering.itemInEditing,
+ tracker = rendering.itemInEditing!!,
onDismissRequest = { rendering.onAction(Action.TrackDialogDismissed) },
- onSave = { rendering.onAction(Action.NewRecordSubmitted(rendering.itemInEditing, it)) }
+ onSave = { rendering.onAction(Action.NewRecordSubmitted(rendering.itemInEditing!!, it)) }
)
}
}
diff --git a/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsScreen.kt b/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsScreen.kt
index 97bbc58..2c0031c 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsScreen.kt
@@ -21,12 +21,13 @@ import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.unit.dp
import androidx.ui.tooling.preview.Preview
import com.popalay.tracktor.core.R
-import com.popalay.tracktor.feature.settings.SettingsWorkflow.Action
+import com.popalay.tracktor.domain.workflow.SettingsWorkflow.Action
+import com.popalay.tracktor.domain.workflow.SettingsWorkflow.Rendering
import com.popalay.tracktor.ui.widget.TopAppBar
import com.popalay.tracktor.utils.onBackPressed
import com.squareup.workflow.ui.compose.composedViewFactory
-val SettingsBinding = composedViewFactory { rendering, _ ->
+val SettingsBinding = composedViewFactory { rendering, _ ->
onBackPressed { rendering.onAction(Action.BackClicked) }
SettingsScreen(rendering.onAction)
}
diff --git a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailContentView.kt b/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailContentView.kt
index 427bf06..aaac073 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailContentView.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailContentView.kt
@@ -19,8 +19,8 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.popalay.tracktor.core.R
import com.popalay.tracktor.domain.formatter.ValueRecordFormatter
-import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow.Action
-import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow.State
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow.Action
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow.State
import com.popalay.tracktor.ui.dialog.AddNewRecordDialog
import com.popalay.tracktor.ui.widget.AnimatedSnackbar
import com.popalay.tracktor.ui.widget.TrackerCategoryList
@@ -76,7 +76,7 @@ fun TrackerDetailContentView(
}
ChartCard(requireNotNull(state.trackerWithRecords), modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp))
TrackerCategoryList(
- categories = state.trackerWithRecords.categories,
+ categories = state.trackerWithRecords?.categories ?: emptyList(),
availableCategories = state.allCategories,
isAddCategoryDialogShowing = state.isAddCategoryDialogShowing,
animate = state.animate,
diff --git a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailScreen.kt b/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailScreen.kt
index 6055045..7330e54 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailScreen.kt
+++ b/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailScreen.kt
@@ -4,28 +4,30 @@ import androidx.compose.runtime.Composable
import androidx.ui.tooling.preview.Preview
import androidx.ui.tooling.preview.PreviewParameter
import androidx.ui.tooling.preview.PreviewParameterProvider
-import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow.Action
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow.Action
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow.Rendering
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow.State
import com.popalay.tracktor.utils.Faker
import com.popalay.tracktor.utils.onBackPressed
import com.squareup.workflow.ui.compose.composedViewFactory
-val TrackerDetailBinding = composedViewFactory { rendering, _ ->
+val TrackerDetailBinding = composedViewFactory { rendering, _ ->
onBackPressed { rendering.onAction(Action.CloseScreen) }
TrackerDetailScreen(rendering.state, rendering.onAction)
}
-class TrackerDetailStatePreviewProvider : PreviewParameterProvider {
- override val values: Sequence
+class TrackerDetailStatePreviewProvider : PreviewParameterProvider {
+ override val values: Sequence
get() = sequenceOf(
- TrackerDetailWorkflow.State(isAddRecordDialogShowing = false),
- TrackerDetailWorkflow.State(isAddRecordDialogShowing = true, trackerWithRecords = Faker.fakeTrackerWithRecords())
+ State(isAddRecordDialogShowing = false),
+ State(isAddRecordDialogShowing = true, trackerWithRecords = Faker.fakeTrackerWithRecords())
)
}
@Preview
@Composable
fun TrackerDetailScreen(
- @PreviewParameter(TrackerDetailStatePreviewProvider::class) state: TrackerDetailWorkflow.State,
+ @PreviewParameter(TrackerDetailStatePreviewProvider::class) state: State,
onAction: (Action) -> Unit = {}
) {
if (state.trackerWithRecords == null) {
diff --git a/build.gradle.kts b/build.gradle.kts
index c5cd216..1539905 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -11,7 +11,10 @@ plugins {
allprojects {
repositories {
maven(url = "https://dl.bintray.com/kotlin/kotlin-eap/")
+ maven(url = "https://kotlin.bintray.com/kotlinx/")
maven(url = "https://jitpack.io")
+ maven(url = "https://dl.bintray.com/ekito/koin")
+ mavenCentral()
jcenter()
google()
}
@@ -36,8 +39,8 @@ subprojects {
configurations.all {
resolutionStrategy {
force(
- "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7",
- "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7"
+ "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9",
+ "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
)
}
}
diff --git a/buildSrc/src/main/java/Config.kt b/buildSrc/src/main/java/Config.kt
index 565d37e..dd22684 100644
--- a/buildSrc/src/main/java/Config.kt
+++ b/buildSrc/src/main/java/Config.kt
@@ -9,27 +9,20 @@ object AndroidConfig {
object Version {
const val androidGradlePlugin = "4.2.0-alpha10"
const val kotlin = "1.4.10"
- const val koin = "2.1.6"
- const val moshi = "1.10.0"
- const val moshiSealed = "0.2.0"
+ const val koin = "3.0.0-alpha-4"
const val compose = "1.0.0-alpha02"
const val workflow = "1.0.0-alpha.1"
const val workflowCompose = "0.30.0"
- const val room = "2.2.5"
const val androidX = "1.5.0-alpha02"
+ const val sqlDelight = "1.4.3"
+ const val coroutines = "1.3.9"
}
object Libs {
const val kotlinStd = "org.jetbrains.kotlin:kotlin-stdlib:${Version.kotlin}"
const val materialDesign = "com.google.android.material:material:1.2.0"
- const val preferenceKtx = "androidx.preference:preference-ktx:1.1.1"
const val androidXCore = "androidx.core:core-ktx:${Version.androidX}"
-
- object Room {
- const val runtime = "androidx.room:room-runtime:${Version.room}"
- const val ktx = "androidx.room:room-ktx:${Version.room}"
- const val compiler = "androidx.room:room-compiler:${Version.room}"
- }
+ const val uuid = "com.benasher44:uuid:0.2.2"
object Compose {
const val animation = "androidx.compose.animation:animation:${Version.compose}"
@@ -41,10 +34,10 @@ object Libs {
}
object Workflow {
- const val core = "com.squareup.workflow:workflow-core-jvm:${Version.workflow}"
- const val runtime = "com.squareup.workflow:workflow-runtime-jvm:${Version.workflow}"
- const val compose = "com.squareup.workflow:workflow-ui-core-compose:${Version.workflowCompose}"
- const val composeTooling = "com.squareup.workflow:workflow-ui-compose-tooling:${Version.workflowCompose}"
+ const val core = "com.squareup.workflow:workflow-core"
+ const val runtime = "com.squareup.workflow:workflow-runtime"
+ const val compose = "com.squareup.workflow:core-compose"
+ const val composeTooling = "com.squareup.workflow:compose-tooling"
}
object Koin {
@@ -52,11 +45,17 @@ object Libs {
const val android = "org.koin:koin-android:${Version.koin}"
}
- object Moshi {
- const val core = "com.squareup.moshi:moshi:${Version.moshi}"
- const val adapters = "com.squareup.moshi:moshi-adapters:${Version.moshi}"
- const val codegen = "com.squareup.moshi:moshi-kotlin-codegen:${Version.moshi}"
- const val sealedAnnotations = "dev.zacsweers.moshisealed:moshi-sealed-annotations:${Version.moshiSealed}"
- const val sealedCodgen = "dev.zacsweers.moshisealed:moshi-sealed-codegen:${Version.moshiSealed}"
+ object SqlDelight {
+ const val runtime = "com.squareup.sqldelight:runtime:${Version.sqlDelight}"
+ const val android = "com.squareup.sqldelight:android-driver:${Version.sqlDelight}"
+ const val native = "com.squareup.sqldelight:native-driver:${Version.sqlDelight}"
+ const val coroutinesExtensions = "com.squareup.sqldelight:coroutines-extensions:${Version.sqlDelight}"
+ }
+
+ object Kotlinx {
+ const val datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.1.0"
+ const val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC"
+ const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.coroutines}"
+ const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.coroutines}"
}
}
\ No newline at end of file
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index edeec3f..624025b 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -1,6 +1,7 @@
plugins {
id("com.android.library")
kotlin("android")
+ kotlin("plugin.serialization") version Version.kotlin
}
android {
@@ -16,19 +17,17 @@ android {
dependencies {
implementation(project(":data"))
+
implementation(Libs.kotlinStd)
implementation(Libs.materialDesign)
implementation(Libs.androidXCore)
-
+ implementation(Libs.Kotlinx.datetime)
+ implementation(Libs.Kotlinx.serialization)
implementation(Libs.Compose.animation)
implementation(Libs.Compose.foundation)
implementation(Libs.Compose.foundationLayout)
implementation(Libs.Compose.material)
implementation(Libs.Compose.runtime)
implementation(Libs.Compose.ui)
-
- implementation(Libs.Workflow.core)
-
implementation(Libs.Koin.core)
- implementation(Libs.Moshi.core)
}
\ No newline at end of file
diff --git a/core/src/main/java/com/popalay/tracktor/utils/DateTimeExtensions.kt b/core/src/main/java/com/popalay/tracktor/utils/DateTimeExtensions.kt
index f07ac9f..63e35e6 100644
--- a/core/src/main/java/com/popalay/tracktor/utils/DateTimeExtensions.kt
+++ b/core/src/main/java/com/popalay/tracktor/utils/DateTimeExtensions.kt
@@ -1,17 +1,18 @@
package com.popalay.tracktor.utils
import android.text.format.DateUtils
-import java.time.Instant
-import java.time.LocalDateTime
-import java.time.ZoneId
-import java.time.ZoneOffset
+import kotlinx.datetime.Clock
+import kotlinx.datetime.LocalDateTime
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.toInstant
-fun LocalDateTime.toRelativeFormat(): String =
- if (LocalDateTime.now().toEpochSecond(ZoneOffset.UTC) - this.toEpochSecond(ZoneOffset.UTC) < 60) {
+fun LocalDateTime.toRelativeFormat(): String {
+ val now = Clock.System.now().toEpochMilliseconds()
+ val time = toInstant(TimeZone.currentSystemDefault()).toEpochMilliseconds()
+ return if (now - time < 60) {
"just now"
} else {
- val time = atZone(ZoneId.systemDefault()).toInstant().toEpochMilli()
- val now = Instant.now().toEpochMilli()
val flags = DateUtils.FORMAT_SHOW_DATE or DateUtils.FORMAT_SHOW_YEAR or DateUtils.FORMAT_ABBREV_MONTH or DateUtils.FORMAT_ABBREV_RELATIVE
DateUtils.getRelativeTimeSpanString(time, now, DateUtils.MINUTE_IN_MILLIS, flags).toString()
- }
\ No newline at end of file
+ }
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/popalay/tracktor/utils/Faker.kt b/core/src/main/java/com/popalay/tracktor/utils/Faker.kt
index a4cb79c..db58dbf 100644
--- a/core/src/main/java/com/popalay/tracktor/utils/Faker.kt
+++ b/core/src/main/java/com/popalay/tracktor/utils/Faker.kt
@@ -1,5 +1,6 @@
package com.popalay.tracktor.utils
+import com.popalay.tracktor.data.extensions.now
import com.popalay.tracktor.data.model.Category
import com.popalay.tracktor.data.model.FeatureFlagListItem
import com.popalay.tracktor.data.model.ProgressDirection
@@ -7,7 +8,7 @@ import com.popalay.tracktor.data.model.TrackableUnit
import com.popalay.tracktor.data.model.Tracker
import com.popalay.tracktor.data.model.TrackerWithRecords
import com.popalay.tracktor.data.model.ValueRecord
-import java.time.LocalDateTime
+import kotlinx.datetime.LocalDateTime
object Faker {
fun fakeTracker(
diff --git a/core/src/main/java/com/popalay/tracktor/utils/WorkflowExtensions.kt b/core/src/main/java/com/popalay/tracktor/utils/WorkflowExtensions.kt
deleted file mode 100644
index 9bcae46..0000000
--- a/core/src/main/java/com/popalay/tracktor/utils/WorkflowExtensions.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.popalay.tracktor.utils
-
-import com.squareup.moshi.Moshi
-import com.squareup.workflow.Snapshot
-import okio.ByteString.Companion.toByteString
-
-@OptIn(ExperimentalStdlibApi::class)
-inline fun T.toSnapshot(moshi: Moshi): Snapshot = Snapshot.of {
- moshi.adapter(T::class.java).toJson(this).encodeToByteArray().toByteString()
-}
-
-@OptIn(ExperimentalStdlibApi::class)
-inline fun Snapshot.toData(moshi: Moshi): T? = moshi.adapter(T::class.java).fromJson(bytes.toByteArray().decodeToString())
\ No newline at end of file
diff --git a/data/.gitignore b/data/.gitignore
deleted file mode 100644
index 84bf89b..0000000
--- a/data/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/build
-/schemas
\ No newline at end of file
diff --git a/data/build.gradle.kts b/data/build.gradle.kts
index 40d3019..4390813 100644
--- a/data/build.gradle.kts
+++ b/data/build.gradle.kts
@@ -1,40 +1,67 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
+
plugins {
id("com.android.library")
- kotlin("android")
- kotlin("kapt")
+ id("com.squareup.sqldelight") version Version.sqlDelight
+ id("org.jetbrains.kotlin.native.cocoapods")
+ kotlin("multiplatform")
+ kotlin("plugin.serialization") version Version.kotlin
}
-kapt {
- correctErrorTypes = true
- useBuildCache = true
-}
+version = AndroidConfig.versionName
-android {
- defaultConfig {
- javaCompileOptions {
- annotationProcessorOptions {
- arguments.putAll(
- setOf(
- "room.schemaLocation" to "$projectDir/schemas",
- "room.incremental" to "true"
- )
- )
+kotlin {
+ android()
+
+ val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
+ if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) ::iosArm64 else ::iosX64
+
+ iOSTarget("ios"){}
+
+ cocoapods {
+ summary = "Shared Data code for Android/iOS"
+ homepage = "Link to a Kotlin/Native module homepage"
+ }
+
+ sourceSets {
+ val commonMain by getting {
+ dependencies {
+ implementation(Libs.Kotlinx.datetime)
+ implementation(Libs.Kotlinx.serialization)
+ implementation(Libs.Kotlinx.coroutinesCore)
+ implementation(Libs.uuid)
+ implementation(Libs.Koin.core)
+ implementation(Libs.SqlDelight.runtime)
+ implementation(Libs.SqlDelight.coroutinesExtensions)
+ }
+ }
+ val androidMain by getting {
+ dependencies {
+ implementation(Libs.Kotlinx.coroutinesAndroid)
+ implementation(Libs.SqlDelight.android)
+ }
+ }
+ val iosMain by getting {
+ dependencies {
+ implementation(Libs.SqlDelight.native)
}
}
+ val commonTest by getting
+ val androidTest by getting
+ val iosTest by getting
}
}
-dependencies {
- implementation(Libs.kotlinStd)
- implementation(Libs.preferenceKtx)
-
- implementation(Libs.Room.runtime)
- implementation(Libs.Room.ktx)
- kapt(Libs.Room.compiler)
-
- implementation(Libs.Koin.core)
- implementation(Libs.Koin.android)
+sqldelight {
+ database("TracktorDatabase") {
+ packageName = "com.popalay.tracktor.db"
+ sourceFolders = listOf("sqldelight")
+ }
+}
- implementation(Libs.Moshi.core)
- kapt(Libs.Moshi.codegen)
+android {
+ sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
+ defaultConfig {
+ consumerProguardFile("proguard-rules.pro")
+ }
}
\ No newline at end of file
diff --git a/data/data.podspec b/data/data.podspec
new file mode 100644
index 0000000..0b47416
--- /dev/null
+++ b/data/data.podspec
@@ -0,0 +1,46 @@
+Pod::Spec.new do |spec|
+ spec.name = 'data'
+ spec.version = '1.8'
+ spec.homepage = 'Link to a Kotlin/Native module homepage'
+ spec.source = { :git => "Not Published", :tag => "Cocoapods/#{spec.name}/#{spec.version}" }
+ spec.authors = ''
+ spec.license = ''
+ spec.summary = 'Shared Data code for Android/iOS'
+
+ spec.static_framework = true
+ spec.vendored_frameworks = "build/cocoapods/framework/data.framework"
+ spec.libraries = "c++"
+ spec.module_name = "#{spec.name}_umbrella"
+
+
+
+
+
+ spec.pod_target_xcconfig = {
+ 'KOTLIN_TARGET[sdk=iphonesimulator*]' => 'ios_x64',
+ 'KOTLIN_TARGET[sdk=iphoneos*]' => 'ios_arm',
+ 'KOTLIN_TARGET[sdk=watchsimulator*]' => 'watchos_x86',
+ 'KOTLIN_TARGET[sdk=watchos*]' => 'watchos_arm',
+ 'KOTLIN_TARGET[sdk=appletvsimulator*]' => 'tvos_x64',
+ 'KOTLIN_TARGET[sdk=appletvos*]' => 'tvos_arm64',
+ 'KOTLIN_TARGET[sdk=macosx*]' => 'macos_x64'
+ }
+
+ spec.script_phases = [
+ {
+ :name => 'Build data',
+ :execution_position => :before_compile,
+ :shell_path => '/bin/sh',
+ :script => <<-SCRIPT
+ set -ev
+ REPO_ROOT="$PODS_TARGET_SRCROOT"
+ "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" :data:syncFramework \
+ -Pkotlin.native.cocoapods.target=$KOTLIN_TARGET \
+ -Pkotlin.native.cocoapods.configuration=$CONFIGURATION \
+ -Pkotlin.native.cocoapods.cflags="$OTHER_CFLAGS" \
+ -Pkotlin.native.cocoapods.paths.headers="$HEADER_SEARCH_PATHS" \
+ -Pkotlin.native.cocoapods.paths.frameworks="$FRAMEWORK_SEARCH_PATHS"
+ SCRIPT
+ }
+ ]
+end
\ No newline at end of file
diff --git a/data/proguard-rules.pro b/data/proguard-rules.pro
index e69de29..2cf8313 100644
--- a/data/proguard-rules.pro
+++ b/data/proguard-rules.pro
@@ -0,0 +1,9 @@
+-keepattributes *Annotation*, InnerClasses
+-dontnote kotlinx.serialization.SerializationKt
+-keep,includedescriptorclasses class com.popalay.data.**$$serializer { *; }
+-keepclassmembers class com.popalay.data.** {
+ *** Companion;
+}
+-keepclasseswithmembers class com.popalay.data.** {
+ kotlinx.serialization.KSerializer serializer(...);
+}
\ No newline at end of file
diff --git a/data/src/androidMain/AndroidManifest.xml b/data/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..0edb2dc
--- /dev/null
+++ b/data/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/data/src/androidMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt b/data/src/androidMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt
new file mode 100644
index 0000000..f0e4d3d
--- /dev/null
+++ b/data/src/androidMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt
@@ -0,0 +1,56 @@
+package com.popalay.tracktor.data
+
+import androidx.sqlite.db.SupportSQLiteDatabase
+import com.popalay.tracktor.data.extensions.now
+import com.popalay.tracktor.data.model.ProgressDirection
+import com.popalay.tracktor.data.model.TrackableUnit
+import com.popalay.tracktor.db.Tracker
+import com.popalay.tracktor.db.TrackerQueries
+import com.popalay.tracktor.db.TracktorDatabase
+import com.popalay.tracktor.db.ValueRecord
+import com.popalay.tracktor.db.ValueRecordQueries
+import com.squareup.sqldelight.android.AndroidSqliteDriver
+import com.squareup.sqldelight.db.SqlDriver
+import kotlinx.coroutines.runBlocking
+import kotlinx.datetime.LocalDateTime
+import org.koin.core.KoinComponent
+import org.koin.core.get
+import java.util.concurrent.Executors
+
+actual class DriverFactory : KoinComponent {
+ actual fun createDriver(): SqlDriver = AndroidSqliteDriver(
+ TracktorDatabase.Schema,
+ get(),
+ "tracktor.db",
+ callback = object : AndroidSqliteDriver.Callback(TracktorDatabase.Schema) {
+ override fun onCreate(db: SupportSQLiteDatabase) {
+ super.onCreate(db)
+ Executors.newSingleThreadScheduledExecutor().execute {
+ runBlocking {
+ get().insert(
+ Tracker(
+ "id",
+ "Number of cool app installs",
+ ProgressDirection.ASCENDING,
+ LocalDateTime.now(),
+ TrackableUnit.Quantity.name,
+ TrackableUnit.Quantity.symbol,
+ TrackableUnit.Quantity.valueType,
+ false
+ )
+ )
+ get().insert(
+ ValueRecord(
+ "id",
+ "id",
+ 42.0,
+ "",
+ LocalDateTime.now()
+ )
+ )
+ }
+ }
+ }
+ }
+ )
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/CategoryRepository.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/CategoryRepository.kt
new file mode 100644
index 0000000..3afda50
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/CategoryRepository.kt
@@ -0,0 +1,39 @@
+package com.popalay.tracktor.data
+
+import com.popalay.tracktor.data.converter.map
+import com.popalay.tracktor.data.model.Category
+import com.popalay.tracktor.db.CategoryQueries
+import com.popalay.tracktor.db.CategoryTrackerRef
+import com.popalay.tracktor.db.CategoryTrackerRefQueries
+import com.squareup.sqldelight.runtime.coroutines.asFlow
+import com.squareup.sqldelight.runtime.coroutines.mapToList
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.withContext
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class CategoryRepository(
+ private val categoryDao: CategoryQueries,
+ private val categoryTrackerRefDao: CategoryTrackerRefQueries
+) {
+ fun getAll(): Flow> = categoryDao.getAll { categoryId, name -> Category(categoryId, name) }.asFlow().mapToList()
+
+ fun getAllByTracker(trackerId: String): Flow> = categoryTrackerRefDao.getAllByTrackerId(trackerId).asFlow().mapToList()
+ .map { refs ->
+ refs.map {
+ categoryDao.getById(it.categoryId) { categoryId, name -> Category(categoryId, name) }.executeAsOne()
+ }
+ }
+
+ suspend fun saveCategories(trackerId: String, categories: List) = withContext(Dispatchers.Default) {
+ categoryTrackerRefDao.transaction {
+ categoryTrackerRefDao.deleteAllByTracker(trackerId)
+ categories.forEach {
+ categoryDao.insert(it.map())
+ categoryTrackerRefDao.insert(CategoryTrackerRef(trackerId, it.categoryId))
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/Dependencies.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/Dependencies.kt
new file mode 100644
index 0000000..9c2738b
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/Dependencies.kt
@@ -0,0 +1,16 @@
+package com.popalay.tracktor.data
+
+import com.popalay.tracktor.db.TracktorDatabase
+import org.koin.dsl.module
+
+val dataModule = module {
+ single { createDatabase(DriverFactory()) }
+
+ single { get().trackerQueries }
+ single { get().valueRecordQueries }
+ single { get().categoryQueries }
+ single { get().categoryTrackerRefQueries }
+
+ single { TrackingRepository(get(), get(), get()) }
+ single { CategoryRepository(get(), get()) }
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt
new file mode 100644
index 0000000..20afd0d
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/DriverFactory.kt
@@ -0,0 +1,27 @@
+package com.popalay.tracktor.data
+
+import com.popalay.tracktor.data.converter.LocalDateTimeConverter
+import com.popalay.tracktor.db.Tracker
+import com.popalay.tracktor.db.TracktorDatabase
+import com.popalay.tracktor.db.ValueRecord
+import com.squareup.sqldelight.EnumColumnAdapter
+import com.squareup.sqldelight.db.SqlDriver
+
+expect class DriverFactory() {
+ fun createDriver(): SqlDriver
+}
+
+fun createDatabase(driverFactory: DriverFactory): TracktorDatabase {
+ val driver = driverFactory.createDriver()
+ return TracktorDatabase(
+ driver,
+ Tracker.Adapter(
+ dateAdapter = LocalDateTimeConverter(),
+ directionAdapter = EnumColumnAdapter(),
+ unitValueTypeAdapter = EnumColumnAdapter()
+ ),
+ ValueRecord.Adapter(
+ dateAdapter = LocalDateTimeConverter()
+ )
+ )
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/TrackingRepository.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/TrackingRepository.kt
new file mode 100644
index 0000000..816f5e2
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/TrackingRepository.kt
@@ -0,0 +1,91 @@
+package com.popalay.tracktor.data
+
+import com.benasher44.uuid.uuid4
+import com.popalay.tracktor.data.converter.map
+import com.popalay.tracktor.data.extensions.now
+import com.popalay.tracktor.data.model.Tracker
+import com.popalay.tracktor.data.model.TrackerWithRecords
+import com.popalay.tracktor.data.model.ValueRecord
+import com.popalay.tracktor.db.TrackerQueries
+import com.popalay.tracktor.db.ValueRecordQueries
+import com.squareup.sqldelight.runtime.coroutines.asFlow
+import com.squareup.sqldelight.runtime.coroutines.mapToList
+import com.squareup.sqldelight.runtime.coroutines.mapToOne
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.withContext
+import kotlinx.datetime.LocalDateTime
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class TrackingRepository(
+ private val trackerDao: TrackerQueries,
+ private val recordDao: ValueRecordQueries,
+ private val categoryRepository: CategoryRepository
+) {
+ fun getTextFromSharedModule() = "You have just gotten text from shared module"
+
+ fun getAllTrackersWithRecords(): Flow> = trackerDao.getAll().asFlow().mapToList()
+ .flatMapLatest { trackers -> combine(trackers.map { fetchDataForTracker(it.map()) }) { it.toList() } }
+
+ fun getTrackerWithRecordsById(id: String): Flow = trackerDao.getById(id).asFlow().mapToOne()
+ .flatMapLatest { fetchDataForTracker(it.map()) }
+
+ suspend fun saveTracker(tracker: Tracker) = withContext(Dispatchers.Default) {
+ trackerDao.insert(tracker.map())
+ }
+
+ suspend fun saveRecord(tracker: Tracker, value: Double) = withContext(Dispatchers.Default) {
+ val record = ValueRecord(
+ id = uuid4().toString(),
+ trackerId = tracker.id,
+ value = value,
+ stringValue = "",
+ date = LocalDateTime.now()
+ )
+ saveRecord(record)
+ }
+
+ suspend fun saveRecord(tracker: Tracker, value: String) = withContext(Dispatchers.Default) {
+ val size = recordDao.getAllByTrackerId(tracker.id).executeAsList().size
+ val record = ValueRecord(
+ id = uuid4().toString(),
+ trackerId = tracker.id,
+ value = size + 1.0,
+ stringValue = value,
+ date = LocalDateTime.now()
+ )
+ saveRecord(record)
+ }
+
+ suspend fun saveRecord(record: ValueRecord) = withContext(Dispatchers.Default) {
+ recordDao.insert(record.map())
+ }
+
+ suspend fun deleteTracker(tracker: Tracker) = withContext(Dispatchers.Default) {
+ trackerDao.deleteById(tracker.id)
+ }
+
+ suspend fun softDeleteTracker(trackerId: String) = withContext(Dispatchers.Default) {
+ trackerDao.softDeleteById(trackerId)
+ }
+
+ suspend fun deleteRecord(record: ValueRecord) = withContext(Dispatchers.Default) {
+ recordDao.deleteById(record.id)
+ }
+
+ suspend fun restoreTracker(trackerId: String) = withContext(Dispatchers.Default) {
+ trackerDao.restoreById(trackerId)
+ }
+
+ suspend fun restoreRecord(record: ValueRecord) = withContext(Dispatchers.Default) {
+ recordDao.insert(record.map())
+ }
+
+ private fun fetchDataForTracker(tracker: Tracker) = recordDao.getAllByTrackerId(tracker.id).asFlow().mapToList()
+ .combine(categoryRepository.getAllByTracker(tracker.id)) { records, categories ->
+ TrackerWithRecords(tracker, records.map { it.map() }, categories)
+ }
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/DataMappers.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/DataMappers.kt
new file mode 100644
index 0000000..dda24d4
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/DataMappers.kt
@@ -0,0 +1,59 @@
+package com.popalay.tracktor.data.converter
+
+import com.popalay.tracktor.data.model.Category
+import com.popalay.tracktor.data.model.TrackableUnit
+import com.popalay.tracktor.data.model.Tracker
+import com.popalay.tracktor.data.model.ValueRecord
+import com.popalay.tracktor.db.Category as CategoryDto
+import com.popalay.tracktor.db.Tracker as TrackerDto
+import com.popalay.tracktor.db.ValueRecord as ValueRecordDto
+
+fun Tracker.map() = TrackerDto(
+ id = id,
+ title = title,
+ direction = direction,
+ date = date,
+ unitName = unit.name,
+ unitSymbol = unit.symbol,
+ unitValueType = unit.valueType,
+ isDeleted = isDeleted,
+)
+
+fun TrackerDto.map() = Tracker(
+ id = id,
+ title = title,
+ direction = direction,
+ date = date,
+ unit = TrackableUnit(
+ name = unitName,
+ symbol = unitSymbol,
+ valueType = unitValueType
+ ),
+ isDeleted = isDeleted,
+)
+
+fun ValueRecord.map() = ValueRecordDto(
+ id = id,
+ trackerId = trackerId,
+ value = value,
+ stringValue = stringValue,
+ date = date,
+)
+
+fun ValueRecordDto.map() = ValueRecord(
+ id = id,
+ trackerId = trackerId,
+ value = value,
+ stringValue = stringValue,
+ date = date,
+)
+
+fun Category.map() = CategoryDto(
+ categoryId = categoryId,
+ name = name
+)
+
+fun CategoryDto.map() = Category(
+ categoryId = categoryId,
+ name = name
+)
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt
new file mode 100644
index 0000000..e21d5aa
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt
@@ -0,0 +1,9 @@
+package com.popalay.tracktor.data.converter
+
+import com.squareup.sqldelight.ColumnAdapter
+import kotlinx.datetime.LocalDateTime
+
+class LocalDateTimeConverter : ColumnAdapter {
+ override fun decode(databaseValue: String): LocalDateTime = LocalDateTime.parse(databaseValue)
+ override fun encode(value: LocalDateTime): String = value.toString()
+}
\ No newline at end of file
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/extensions/DateTimeExtensions.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/extensions/DateTimeExtensions.kt
new file mode 100644
index 0000000..96f6020
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/extensions/DateTimeExtensions.kt
@@ -0,0 +1,8 @@
+package com.popalay.tracktor.data.extensions
+
+import kotlinx.datetime.Clock
+import kotlinx.datetime.LocalDateTime
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.toLocalDateTime
+
+fun LocalDateTime.Companion.now() = Clock.System.now().toLocalDateTime(TimeZone.currentSystemDefault())
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/Category.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Category.kt
similarity index 69%
rename from data/src/main/java/com/popalay/tracktor/data/model/Category.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Category.kt
index 2ec6685..dd1d4ed 100644
--- a/data/src/main/java/com/popalay/tracktor/data/model/Category.kt
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Category.kt
@@ -1,13 +1,10 @@
package com.popalay.tracktor.data.model
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import com.squareup.moshi.JsonClass
+import kotlinx.serialization.Serializable
-@Entity
-@JsonClass(generateAdapter = true)
+@Serializable
data class Category(
- @PrimaryKey val categoryId: String,
+ val categoryId: String,
val name: String
) {
companion object {
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/FeatureFlagListItem.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/FeatureFlagListItem.kt
similarity index 100%
rename from data/src/main/java/com/popalay/tracktor/data/model/FeatureFlagListItem.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/FeatureFlagListItem.kt
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/ListItem.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/ListItem.kt
similarity index 100%
rename from data/src/main/java/com/popalay/tracktor/data/model/ListItem.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/ListItem.kt
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/Statistic.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Statistic.kt
similarity index 86%
rename from data/src/main/java/com/popalay/tracktor/data/model/Statistic.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Statistic.kt
index b1778ab..f760436 100644
--- a/data/src/main/java/com/popalay/tracktor/data/model/Statistic.kt
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Statistic.kt
@@ -2,8 +2,9 @@ package com.popalay.tracktor.data.model
import com.popalay.tracktor.data.model.ProgressDirection.ASCENDING
import com.popalay.tracktor.data.model.ProgressDirection.DESCENDING
-import java.time.LocalDateTime
-import java.time.ZoneOffset
+import kotlinx.datetime.LocalDateTime
+import kotlinx.datetime.TimeZone
+import kotlinx.datetime.toInstant
data class Statistic(
val trackerCount: Int,
@@ -23,10 +24,10 @@ data class Statistic(
it.progress() < 0 && it.tracker.direction == DESCENDING
}
val lastUpdatedTracker = trackers.maxByOrNull { trackerWithRecords ->
- trackerWithRecords.records.map { it.date.toInstant(ZoneOffset.UTC).epochSecond }.maxOrNull() ?: 0
+ trackerWithRecords.records.map { it.date.toInstant(TimeZone.UTC).epochSeconds }.maxOrNull() ?: 0
}
val lastUpdatedTrackerDate = lastUpdatedTracker?.let {
- lastUpdatedTracker.records.maxByOrNull { it.date.toInstant(ZoneOffset.UTC).epochSecond }?.date ?: lastUpdatedTracker.tracker.date
+ lastUpdatedTracker.records.maxByOrNull { it.date.toInstant(TimeZone.UTC).epochSeconds }?.date ?: lastUpdatedTracker.tracker.date
}
val mostProgressiveTracker = trackers.maxByOrNull {
it.progress() * if (it.tracker.direction == DESCENDING) -1 else 1
@@ -35,7 +36,7 @@ data class Statistic(
trackerCount = trackerCount,
trackersWithProgress = trackersWithProgress,
lastUpdatedTracker = lastUpdatedTracker!!.tracker,
- lastUpdatedTrackerDate = lastUpdatedTrackerDate ?: LocalDateTime.MIN,
+ lastUpdatedTrackerDate = lastUpdatedTrackerDate ?: LocalDateTime.parse(""),
mostProgressiveTracker = mostProgressiveTracker!!.tracker
)
}
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/TrackableUnit.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackableUnit.kt
similarity index 90%
rename from data/src/main/java/com/popalay/tracktor/data/model/TrackableUnit.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackableUnit.kt
index 48d1777..7908535 100644
--- a/data/src/main/java/com/popalay/tracktor/data/model/TrackableUnit.kt
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackableUnit.kt
@@ -1,8 +1,9 @@
package com.popalay.tracktor.data.model
-import com.squareup.moshi.JsonClass
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.Transient
-@JsonClass(generateAdapter = true)
+@Serializable
data class TrackableUnit(
val name: String,
val symbol: String,
@@ -24,7 +25,7 @@ data class TrackableUnit(
}
}
-@JsonClass(generateAdapter = false)
+@Serializable
enum class UnitValueType(val displayName: String) {
NONE(""),
TEXT("Text"),
@@ -32,7 +33,7 @@ enum class UnitValueType(val displayName: String) {
INTEGER("Integer")
}
-@JsonClass(generateAdapter = false)
+@Serializable
enum class ProgressDirection(val displayName: String) {
ASCENDING("Ascending"),
DESCENDING("Descending")
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/Tracker.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Tracker.kt
similarity index 70%
rename from data/src/main/java/com/popalay/tracktor/data/model/Tracker.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Tracker.kt
index d0b1ea0..7a4fc22 100644
--- a/data/src/main/java/com/popalay/tracktor/data/model/Tracker.kt
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/Tracker.kt
@@ -1,15 +1,11 @@
package com.popalay.tracktor.data.model
-import androidx.room.Embedded
-import androidx.room.Entity
-import androidx.room.PrimaryKey
-import java.time.LocalDateTime
+import kotlinx.datetime.LocalDateTime
-@Entity
data class Tracker(
- @PrimaryKey val id: String,
+ val id: String,
val title: String,
- @Embedded val unit: TrackableUnit,
+ val unit: TrackableUnit,
val direction: ProgressDirection,
val date: LocalDateTime,
val isDeleted: Boolean,
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt
new file mode 100644
index 0000000..1261be8
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt
@@ -0,0 +1,6 @@
+package com.popalay.tracktor.data.model
+
+data class TrackerCategoryCrossRef(
+ val id: String,
+ val categoryId: String
+)
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/TrackerListItem.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerListItem.kt
similarity index 100%
rename from data/src/main/java/com/popalay/tracktor/data/model/TrackerListItem.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerListItem.kt
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/TrackerWithRecords.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerWithRecords.kt
similarity index 55%
rename from data/src/main/java/com/popalay/tracktor/data/model/TrackerWithRecords.kt
rename to data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerWithRecords.kt
index a39d255..3a30cd2 100644
--- a/data/src/main/java/com/popalay/tracktor/data/model/TrackerWithRecords.kt
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/TrackerWithRecords.kt
@@ -1,21 +1,8 @@
package com.popalay.tracktor.data.model
-import androidx.room.Embedded
-import androidx.room.Junction
-import androidx.room.Relation
-
data class TrackerWithRecords(
- @Embedded val tracker: Tracker,
- @Relation(
- parentColumn = "id",
- entityColumn = "trackerId"
- )
+ val tracker: Tracker,
val records: List,
- @Relation(
- parentColumn = "id",
- entityColumn = "categoryId",
- associateBy = Junction(TrackerCategoryCrossRef::class)
- )
val categories: List
) {
val currentValue: ValueRecord? get() = records.lastOrNull()
diff --git a/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/ValueRecord.kt b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/ValueRecord.kt
new file mode 100644
index 0000000..64593c7
--- /dev/null
+++ b/data/src/commonMain/kotlin/com/popalay/tracktor/data/model/ValueRecord.kt
@@ -0,0 +1,11 @@
+package com.popalay.tracktor.data.model
+
+import kotlinx.datetime.LocalDateTime
+
+data class ValueRecord(
+ val id: String,
+ val trackerId: String,
+ val value: Double,
+ val stringValue: String,
+ val date: LocalDateTime
+)
\ No newline at end of file
diff --git a/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Category.sq b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Category.sq
new file mode 100644
index 0000000..60cec39
--- /dev/null
+++ b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Category.sq
@@ -0,0 +1,16 @@
+CREATE TABLE Category (
+ categoryId TEXT PRIMARY KEY NOT NULL,
+ name TEXT NOT NULL
+);
+
+insert:
+INSERT OR IGNORE INTO Category(categoryId, name) VALUES ?;
+
+deleteById:
+DELETE FROM Category WHERE categoryId = ?;
+
+getAll:
+SELECT * FROM Category ORDER BY name DESC;
+
+getById:
+SELECT * FROM Category WHERE categoryId = ?;
\ No newline at end of file
diff --git a/data/src/commonMain/sqldelight/com/popalay/tracktor/db/CategoryTrackerRef.sq b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/CategoryTrackerRef.sq
new file mode 100644
index 0000000..ea764f6
--- /dev/null
+++ b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/CategoryTrackerRef.sq
@@ -0,0 +1,18 @@
+CREATE TABLE CategoryTrackerRef(
+ trackerId TEXT NOT NULL,
+ categoryId TEXT NOT NULL,
+ FOREIGN KEY(trackerId) REFERENCES Tracker(id) ON DELETE CASCADE,
+ FOREIGN KEY(categoryId) REFERENCES Category(categoryId) ON DELETE CASCADE
+);
+
+CREATE INDEX TrackerIndex ON CategoryTrackerRef(trackerId);
+CREATE INDEX CategoryIndex ON CategoryTrackerRef(categoryId);
+
+insert:
+INSERT OR ABORT INTO CategoryTrackerRef(trackerId, categoryId) VALUES ?;
+
+deleteAllByTracker:
+DELETE FROM CategoryTrackerRef WHERE trackerId = ?;
+
+getAllByTrackerId:
+SELECT * FROM CategoryTrackerRef WHERE trackerId = ?;
\ No newline at end of file
diff --git a/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Tracker.sq b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Tracker.sq
new file mode 100644
index 0000000..e290f3b
--- /dev/null
+++ b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/Tracker.sq
@@ -0,0 +1,35 @@
+import kotlinx.datetime.LocalDateTime;
+import com.popalay.tracktor.data.model.UnitValueType;
+import com.popalay.tracktor.data.model.ProgressDirection;
+
+CREATE TABLE Tracker (
+ id TEXT PRIMARY KEY NOT NULL,
+ title TEXT NOT NULL,
+ direction TEXT as ProgressDirection NOT NULL,
+ date TEXT as LocalDateTime NOT NULL,
+ unitName TEXT NOT NULL,
+ unitSymbol TEXT NOT NULL,
+ unitValueType TEXT as UnitValueType NOT NULL,
+ isDeleted INTEGER AS Boolean NOT NULL DEFAULT 0
+);
+
+insert:
+INSERT OR REPLACE INTO Tracker(id, title, direction, date, unitName, unitSymbol, unitValueType) VALUES ?;
+
+deleteById:
+DELETE FROM Tracker WHERE id = ?;
+
+getAll:
+SELECT * FROM Tracker WHERE isDeleted = 0 ORDER BY date DESC;
+
+getById:
+SELECT * FROM Tracker WHERE id = ?;
+
+softDeleteById:
+UPDATE Tracker SET isDeleted = 1 WHERE id = ?;
+
+restoreById:
+UPDATE Tracker SET isDeleted = 0 WHERE id = ?;
+
+getAllWithTrackers:
+SELECT * FROM Tracker LEFT JOIN ValueRecord ON trackerId = Tracker.id;
\ No newline at end of file
diff --git a/data/src/commonMain/sqldelight/com/popalay/tracktor/db/ValueRecord.sq b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/ValueRecord.sq
new file mode 100644
index 0000000..8abfa5d
--- /dev/null
+++ b/data/src/commonMain/sqldelight/com/popalay/tracktor/db/ValueRecord.sq
@@ -0,0 +1,19 @@
+import kotlinx.datetime.LocalDateTime;
+
+CREATE TABLE ValueRecord (
+ id TEXT PRIMARY KEY NOT NULL,
+ trackerId TEXT NOT NULL,
+ value REAL NOT NULL,
+ stringValue TEXT NOT NULL,
+ date TEXT as LocalDateTime NOT NULL,
+ FOREIGN KEY(trackerId) REFERENCES Tracker(id) ON UPDATE NO ACTION ON DELETE CASCADE
+);
+
+insert:
+INSERT OR ABORT INTO ValueRecord(id, trackerId, value, stringValue, date) VALUES ?;
+
+deleteById:
+DELETE FROM ValueRecord WHERE id = ?;
+
+getAllByTrackerId:
+SELECT * FROM ValueRecord WHERE trackerId = ?;
\ No newline at end of file
diff --git a/data/src/iosMain/kotlin/com.popalay.tracktor.data/DriverFactory.kt b/data/src/iosMain/kotlin/com.popalay.tracktor.data/DriverFactory.kt
new file mode 100644
index 0000000..1217304
--- /dev/null
+++ b/data/src/iosMain/kotlin/com.popalay.tracktor.data/DriverFactory.kt
@@ -0,0 +1,11 @@
+package com.popalay.tracktor.data
+
+import com.popalay.tracktor.db.TracktorDatabase
+import com.squareup.sqldelight.db.SqlDriver
+import com.squareup.sqldelight.drivers.native.NativeSqliteDriver
+
+actual class DriverFactory {
+ actual fun createDriver(): SqlDriver {
+ return NativeSqliteDriver(TracktorDatabase.Schema, "tracktor.db")
+ }
+}
\ No newline at end of file
diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml
deleted file mode 100644
index 5cc466d..0000000
--- a/data/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/AppDatabase.kt b/data/src/main/java/com/popalay/tracktor/data/AppDatabase.kt
deleted file mode 100644
index 9e88e61..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/AppDatabase.kt
+++ /dev/null
@@ -1,128 +0,0 @@
-package com.popalay.tracktor.data
-
-import androidx.room.Database
-import androidx.room.RoomDatabase
-import androidx.room.TypeConverters
-import androidx.room.migration.Migration
-import androidx.sqlite.db.SupportSQLiteDatabase
-import com.popalay.tracktor.data.converter.LocalDateTimeConverter
-import com.popalay.tracktor.data.converter.ProgressDirectionConverter
-import com.popalay.tracktor.data.converter.UnitValueTypeConverter
-import com.popalay.tracktor.data.model.Category
-import com.popalay.tracktor.data.model.Tracker
-import com.popalay.tracktor.data.model.TrackerCategoryCrossRef
-import com.popalay.tracktor.data.model.ValueRecord
-
-@TypeConverters(value = [LocalDateTimeConverter::class, UnitValueTypeConverter::class, ProgressDirectionConverter::class])
-@Database(entities = [Tracker::class, ValueRecord::class, Category::class, TrackerCategoryCrossRef::class], version = 8)
-abstract class AppDatabase : RoomDatabase() {
- abstract fun trackerDao(): TrackerDao
- abstract fun recordDao(): RecordDao
- abstract fun categoryDao(): CategoryDao
-}
-
-val MIGRATION_1_2 = object : Migration(1, 2) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE tracker ADD COLUMN date TEXT NOT NULL DEFAULT '2020-07-02T10:15:30'")
- }
-}
-
-val MIGRATION_2_3 = object : Migration(2, 3) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE ValueRecord ADD COLUMN stringValue TEXT NOT NULL DEFAULT ''")
- }
-}
-
-val MIGRATION_3_4 = object : Migration(3, 4) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("BEGIN TRANSACTION;")
- // Create the new table
- database.execSQL(
- "CREATE TABLE tracker_new(" +
- "id TEXT NOT NULL," +
- "title TEXT NOT NULL," +
- "date TEXT NOT NULL," +
- "name TEXT NOT NULL," +
- "symbol TEXT NOT NULL DEFAULT ''," +
- "valueType TEXT NOT NULL DEFAULT 'DOUBLE'," +
- "PRIMARY KEY(id)" +
- ")"
- )
- // Copy the data
- database.execSQL(
- "INSERT INTO tracker_new(id, title, date, name)" +
- "SELECT id, title, date, tracker.unit " +
- "FROM tracker"
- )
- // Remove the old table
- database.execSQL("DROP TABLE tracker")
- // Change the table name to the correct one
- database.execSQL("ALTER TABLE tracker_new RENAME TO tracker")
- database.execSQL("COMMIT;")
- }
-}
-
-val MIGRATION_4_5 = object : Migration(4, 5) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("BEGIN TRANSACTION;")
- // Create a new translation table
- database.execSQL(
- "CREATE TABLE IF NOT EXISTS ValueRecord_new(" +
- "id TEXT NOT NULL," +
- "trackerId TEXT NOT NULL," +
- "value REAL NOT NULL," +
- "stringValue TEXT NOT NULL," +
- "date TEXT NOT NULL," +
- "PRIMARY KEY(id)," +
- "FOREIGN KEY(trackerId) REFERENCES Tracker(id) ON UPDATE NO ACTION ON DELETE CASCADE" +
- ")"
- )
- // Copy the data
- database.execSQL(
- "INSERT INTO ValueRecord_new(id, trackerId, value, stringValue, date) " +
- "SELECT id, trackerId, value, stringValue, date " +
- "FROM ValueRecord"
- )
- // Remove old table
- database.execSQL("DROP TABLE ValueRecord")
- // Change name of table to correct one
- database.execSQL("ALTER TABLE ValueRecord_new RENAME TO ValueRecord")
- database.execSQL("COMMIT;")
- }
-}
-
-val MIGRATION_5_6 = object : Migration(5, 6) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE tracker ADD COLUMN direction TEXT NOT NULL DEFAULT 'ASCENDING'")
- }
-}
-
-val MIGRATION_6_7 = object : Migration(6, 7) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("BEGIN TRANSACTION;")
- database.execSQL(
- "CREATE TABLE IF NOT EXISTS Category(" +
- "categoryId TEXT NOT NULL," +
- "name TEXT NOT NULL," +
- "PRIMARY KEY(categoryId)" +
- ")"
- )
- database.execSQL(
- "CREATE TABLE IF NOT EXISTS TrackerCategoryCrossRef(" +
- "id TEXT NOT NULL," +
- "categoryId TEXT NOT NULL," +
- "PRIMARY KEY(id, categoryId)," +
- "FOREIGN KEY(id) REFERENCES Tracker(id) ON UPDATE NO ACTION ON DELETE CASCADE" +
- ")"
- )
- database.execSQL("CREATE INDEX IF NOT EXISTS index_TrackerCategoryCrossRef_categoryId ON TrackerCategoryCrossRef(categoryId)")
- database.execSQL("CREATE INDEX IF NOT EXISTS index_TrackerCategoryCrossRef_id ON TrackerCategoryCrossRef(id)")
- database.execSQL("COMMIT;")
- }
-}
-
-val MIGRATION_7_8 = object : Migration(7, 8) {
- override fun migrate(database: SupportSQLiteDatabase) {
- database.execSQL("ALTER TABLE tracker ADD COLUMN isDeleted INTEGER NOT NULL default 0")
- }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/CategoryDao.kt b/data/src/main/java/com/popalay/tracktor/data/CategoryDao.kt
deleted file mode 100644
index 6849c7a..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/CategoryDao.kt
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.popalay.tracktor.data
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.OnConflictStrategy
-import androidx.room.Query
-import androidx.room.Transaction
-import com.popalay.tracktor.data.model.Category
-import com.popalay.tracktor.data.model.TrackerCategoryCrossRef
-import kotlinx.coroutines.flow.Flow
-
-@Dao
-interface CategoryDao {
- @Transaction
- @Query("SELECT * FROM category ORDER by name DESC")
- fun getAll(): Flow>
-
- @Insert
- suspend fun insert(value: Category)
-
- @Insert(onConflict = OnConflictStrategy.IGNORE)
- suspend fun insertAllRefs(values: List)
-
- @Insert(onConflict = OnConflictStrategy.IGNORE)
- suspend fun insertAll(values: List)
-
- @Delete
- suspend fun delete(value: Category)
-
- @Query("DELETE FROM trackercategorycrossref WHERE id = :trackerId")
- suspend fun deleteAllByTrackerId(trackerId: String)
-
- @Transaction
- suspend fun updateForTracker(trackerId: String, categories: List) {
- deleteAllByTrackerId(trackerId)
- insertAll(categories)
- insertAllRefs(categories.map { TrackerCategoryCrossRef(trackerId, it.categoryId) })
- }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/CategoryRepository.kt b/data/src/main/java/com/popalay/tracktor/data/CategoryRepository.kt
deleted file mode 100644
index 2c44cdc..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/CategoryRepository.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.popalay.tracktor.data
-
-import com.popalay.tracktor.data.model.Category
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.withContext
-
-class CategoryRepository(
- private val categoryDao: CategoryDao
-) {
- fun getAll(): Flow> = categoryDao.getAll()
- .flowOn(Dispatchers.IO)
-
- suspend fun saveCategories(trackerId: String, categories: List) = withContext(Dispatchers.IO) {
- categoryDao.updateForTracker(trackerId, categories)
- }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/DatabaseCallback.kt b/data/src/main/java/com/popalay/tracktor/data/DatabaseCallback.kt
deleted file mode 100644
index fb0fec3..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/DatabaseCallback.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package com.popalay.tracktor.data
-
-import androidx.room.RoomDatabase
-import androidx.sqlite.db.SupportSQLiteDatabase
-import com.popalay.tracktor.data.model.ProgressDirection
-import com.popalay.tracktor.data.model.TrackableUnit
-import com.popalay.tracktor.data.model.Tracker
-import com.popalay.tracktor.data.model.ValueRecord
-import kotlinx.coroutines.runBlocking
-import org.koin.core.KoinComponent
-import org.koin.core.get
-import java.time.LocalDateTime
-import java.util.concurrent.Executors
-
-class DatabaseCallback : RoomDatabase.Callback(), KoinComponent {
- override fun onCreate(db: SupportSQLiteDatabase) {
- Executors.newSingleThreadScheduledExecutor().execute {
- runBlocking {
- get().insert(
- Tracker(
- "id",
- "Number of cool app installs",
- TrackableUnit.Quantity,
- ProgressDirection.ASCENDING,
- LocalDateTime.now(),
- false
- )
- )
- get().insert(ValueRecord("id", "id", 42.0, "", LocalDateTime.now()))
- }
- }
- }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/Dependencies.kt b/data/src/main/java/com/popalay/tracktor/data/Dependencies.kt
deleted file mode 100644
index 5585355..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/Dependencies.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.popalay.tracktor.data
-
-import android.content.SharedPreferences
-import androidx.preference.PreferenceManager
-import androidx.room.Room
-import com.squareup.moshi.Moshi
-import org.koin.android.ext.koin.androidContext
-import org.koin.dsl.module
-
-val dataModule = module {
- single {
- Room.databaseBuilder(androidContext(), AppDatabase::class.java, "database-name")
- .addMigrations(MIGRATION_1_2, MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8)
- .addCallback(DatabaseCallback()).build()
- }
-
- single { get().trackerDao() }
- single { get().recordDao() }
- single { get().categoryDao() }
-
- single { TrackingRepository(get(), get(), get()) }
- single { CategoryRepository(get()) }
-
- single { PreferenceManager.getDefaultSharedPreferences(get()) }
-
- single { Moshi.Builder().build() }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/RecordDao.kt b/data/src/main/java/com/popalay/tracktor/data/RecordDao.kt
deleted file mode 100644
index 1f7dc92..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/RecordDao.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.popalay.tracktor.data
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
-import com.popalay.tracktor.data.model.ValueRecord
-
-@Dao
-interface RecordDao {
- @Insert
- suspend fun insert(value: ValueRecord)
-
- @Insert
- suspend fun insertAll(value: List)
-
- @Query("SELECT * FROM ValueRecord WHERE trackerId=:trackerId")
- suspend fun getAllByTrackerId(trackerId: String): List
-
- @Delete
- suspend fun delete(value: ValueRecord)
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/TrackerDao.kt b/data/src/main/java/com/popalay/tracktor/data/TrackerDao.kt
deleted file mode 100644
index f95c324..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/TrackerDao.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.popalay.tracktor.data
-
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.OnConflictStrategy
-import androidx.room.Query
-import androidx.room.Transaction
-import com.popalay.tracktor.data.model.Tracker
-import com.popalay.tracktor.data.model.TrackerWithRecords
-import kotlinx.coroutines.flow.Flow
-
-@Dao
-interface TrackerDao {
- @Transaction
- @Query("SELECT * FROM tracker WHERE isDeleted = 0 ORDER by date DESC")
- fun getAllTrackersWithRecords(): Flow>
-
- @Transaction
- @Query("SELECT * FROM tracker WHERE id=:id")
- fun getTrackerWithRecordsById(id: String): Flow
-
- @Insert(onConflict = OnConflictStrategy.REPLACE)
- suspend fun insert(value: Tracker)
-
- @Delete
- suspend fun delete(value: Tracker)
-
- @Query("UPDATE tracker SET isDeleted = 1 WHERE id=:id")
- suspend fun softDelete(id: String)
-
- @Query("UPDATE tracker SET isDeleted = 0 WHERE id=:id")
- suspend fun restore(id: String)
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/TrackingRepository.kt b/data/src/main/java/com/popalay/tracktor/data/TrackingRepository.kt
deleted file mode 100644
index cd67325..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/TrackingRepository.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-package com.popalay.tracktor.data
-
-import com.popalay.tracktor.data.model.Tracker
-import com.popalay.tracktor.data.model.TrackerWithRecords
-import com.popalay.tracktor.data.model.ValueRecord
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.withContext
-import java.time.LocalDateTime
-import java.util.UUID
-
-class TrackingRepository(
- private val trackerDao: TrackerDao,
- private val recordDao: RecordDao,
- private val categoryDao: CategoryDao
-) {
- fun getAllTrackersWithRecords(): Flow> = trackerDao.getAllTrackersWithRecords()
- .flowOn(Dispatchers.IO)
-
- fun getTrackerWithRecordsById(id: String): Flow = trackerDao.getTrackerWithRecordsById(id)
- .flowOn(Dispatchers.IO)
-
- suspend fun saveTracker(tracker: Tracker) = withContext(Dispatchers.IO) {
- trackerDao.insert(tracker)
- }
-
- suspend fun saveRecord(tracker: Tracker, value: Double) = withContext(Dispatchers.IO) {
- val record = ValueRecord(
- id = UUID.randomUUID().toString(),
- trackerId = tracker.id,
- value = value,
- stringValue = "",
- date = LocalDateTime.now()
- )
- saveRecord(record)
- }
-
- suspend fun saveRecord(tracker: Tracker, value: String) = withContext(Dispatchers.IO) {
- val size = recordDao.getAllByTrackerId(tracker.id).size
- val record = ValueRecord(
- id = UUID.randomUUID().toString(),
- trackerId = tracker.id,
- value = size + 1.0,
- stringValue = value,
- date = LocalDateTime.now()
- )
- saveRecord(record)
- }
-
- suspend fun saveRecord(record: ValueRecord) = withContext(Dispatchers.IO) {
- recordDao.insert(record)
- }
-
- suspend fun deleteTracker(tracker: Tracker) = withContext(Dispatchers.IO) {
- trackerDao.delete(tracker)
- }
-
- suspend fun softDeleteTracker(trackerId: String) = withContext(Dispatchers.IO) {
- trackerDao.softDelete(trackerId)
- }
-
- suspend fun deleteRecord(record: ValueRecord) = withContext(Dispatchers.IO) {
- recordDao.delete(record)
- }
-
- suspend fun restoreTracker(trackerId: String) = withContext(Dispatchers.IO) {
- trackerDao.restore(trackerId)
- }
-
- suspend fun restoreRecord(record: ValueRecord) = withContext(Dispatchers.IO) {
- recordDao.insert(record)
- }
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt b/data/src/main/java/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt
deleted file mode 100644
index 38b5bdb..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/converter/LocalDateTimeConverter.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.popalay.tracktor.data.converter
-
-import androidx.room.TypeConverter
-import java.time.LocalDateTime
-
-class LocalDateTimeConverter {
- @TypeConverter
- fun decode(value: String?): LocalDateTime? {
- if (value == null) return null
- return LocalDateTime.parse(value)
- }
-
- @TypeConverter
- fun encode(value: LocalDateTime?): String? = value?.toString()
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/converter/ProgressDirectionConverter.kt b/data/src/main/java/com/popalay/tracktor/data/converter/ProgressDirectionConverter.kt
deleted file mode 100644
index 3636981..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/converter/ProgressDirectionConverter.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.popalay.tracktor.data.converter
-
-import androidx.room.TypeConverter
-import com.popalay.tracktor.data.model.ProgressDirection
-
-class ProgressDirectionConverter {
- @TypeConverter
- fun decode(value: String?): ProgressDirection? {
- if (value == null) return null
- return ProgressDirection.valueOf(value)
- }
-
- @TypeConverter
- fun encode(value: ProgressDirection?): String? = value?.name
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/converter/UnitValueTypeConverter.kt b/data/src/main/java/com/popalay/tracktor/data/converter/UnitValueTypeConverter.kt
deleted file mode 100644
index 76bec5a..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/converter/UnitValueTypeConverter.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package com.popalay.tracktor.data.converter
-
-import androidx.room.TypeConverter
-import com.popalay.tracktor.data.model.UnitValueType
-
-class UnitValueTypeConverter {
- @TypeConverter
- fun decode(value: String?): UnitValueType? {
- if (value == null) return null
- return UnitValueType.valueOf(value)
- }
-
- @TypeConverter
- fun encode(value: UnitValueType?): String? = value?.name
-}
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/featureflags/FeatureFlagsManager.kt b/data/src/main/java/com/popalay/tracktor/data/featureflags/FeatureFlagsManager.kt
deleted file mode 100644
index af2e9d9..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/featureflags/FeatureFlagsManager.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.popalay.tracktor.data.featureflags
-
-interface FeatureFlagsManager
-
-class RealFeatureFlagsManager : FeatureFlagsManager
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt b/data/src/main/java/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt
deleted file mode 100644
index e5f92fc..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/model/TrackerCategoryCrossRef.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package com.popalay.tracktor.data.model
-
-import androidx.room.Entity
-import androidx.room.ForeignKey
-import androidx.room.Index
-
-@Entity(
- primaryKeys = ["id", "categoryId"],
- indices = [Index("categoryId"), Index("id")],
- foreignKeys = [
- ForeignKey(
- entity = Tracker::class,
- parentColumns = ["id"],
- childColumns = ["id"],
- onDelete = ForeignKey.CASCADE
- )
- ]
-)
-data class TrackerCategoryCrossRef(
- val id: String,
- val categoryId: String
-)
\ No newline at end of file
diff --git a/data/src/main/java/com/popalay/tracktor/data/model/ValueRecord.kt b/data/src/main/java/com/popalay/tracktor/data/model/ValueRecord.kt
deleted file mode 100644
index 3bda15d..0000000
--- a/data/src/main/java/com/popalay/tracktor/data/model/ValueRecord.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.popalay.tracktor.data.model
-
-import androidx.room.Entity
-import androidx.room.ForeignKey
-import androidx.room.PrimaryKey
-import java.time.LocalDateTime
-
-@Entity(
- foreignKeys = [
- ForeignKey(
- entity = Tracker::class,
- parentColumns = ["id"],
- childColumns = ["trackerId"],
- onUpdate = ForeignKey.NO_ACTION,
- onDelete = ForeignKey.CASCADE
- )
- ]
-)
-data class ValueRecord(
- @PrimaryKey val id: String,
- val trackerId: String,
- val value: Double,
- val stringValue: String,
- val date: LocalDateTime
-)
\ No newline at end of file
diff --git a/domain/.gitignore b/domain/.gitignore
deleted file mode 100644
index 42afabf..0000000
--- a/domain/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts
index c09a37f..ef30579 100644
--- a/domain/build.gradle.kts
+++ b/domain/build.gradle.kts
@@ -1,13 +1,53 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
+
plugins {
id("com.android.library")
- kotlin("android")
+ id("org.jetbrains.kotlin.native.cocoapods")
+ kotlin("multiplatform")
+ kotlin("plugin.serialization") version Version.kotlin
}
-dependencies {
- implementation(project(":data"))
- implementation(Libs.kotlinStd)
+version = AndroidConfig.versionName
+
+kotlin {
+ android()
+
+ val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
+ if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true) ::iosArm64 else ::iosX64
+
+ iOSTarget("ios") {}
- implementation(Libs.Workflow.core)
+ cocoapods {
+ summary = "Shared Domain code for Android/iOS"
+ homepage = "Link to a Kotlin/Native module homepage"
+ podfile = project.file("../ios/Tracktor/Podfile")
+ }
+
+ sourceSets {
+ val commonMain by getting {
+ dependencies {
+ api(project(":data"))
+
+ implementation(Libs.uuid)
+ implementation(Libs.Kotlinx.serialization)
+ api(Libs.Workflow.core) {
+ version { branch = "popalay/multiplatform" }
+ }
+ api(Libs.Kotlinx.datetime)
+ api(Libs.Koin.core)
+ }
+ }
+ val androidMain by getting
+ val iosMain by getting
+ val commonTest by getting
+ val androidTest by getting
+ val iosTest by getting
+ }
+}
- implementation(Libs.Koin.core)
+android {
+ sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
+ defaultConfig {
+ consumerProguardFile("proguard-rules.pro")
+ }
}
\ No newline at end of file
diff --git a/domain/domain.podspec b/domain/domain.podspec
new file mode 100644
index 0000000..cb0b029
--- /dev/null
+++ b/domain/domain.podspec
@@ -0,0 +1,46 @@
+Pod::Spec.new do |spec|
+ spec.name = 'domain'
+ spec.version = '1.8'
+ spec.homepage = 'Link to a Kotlin/Native module homepage'
+ spec.source = { :git => "Not Published", :tag => "Cocoapods/#{spec.name}/#{spec.version}" }
+ spec.authors = ''
+ spec.license = ''
+ spec.summary = 'Shared Domain code for Android/iOS'
+
+ spec.static_framework = true
+ spec.vendored_frameworks = "build/cocoapods/framework/domain.framework"
+ spec.libraries = "c++"
+ spec.module_name = "#{spec.name}_umbrella"
+
+
+
+
+
+ spec.pod_target_xcconfig = {
+ 'KOTLIN_TARGET[sdk=iphonesimulator*]' => 'ios_x64',
+ 'KOTLIN_TARGET[sdk=iphoneos*]' => 'ios_arm',
+ 'KOTLIN_TARGET[sdk=watchsimulator*]' => 'watchos_x86',
+ 'KOTLIN_TARGET[sdk=watchos*]' => 'watchos_arm',
+ 'KOTLIN_TARGET[sdk=appletvsimulator*]' => 'tvos_x64',
+ 'KOTLIN_TARGET[sdk=appletvos*]' => 'tvos_arm64',
+ 'KOTLIN_TARGET[sdk=macosx*]' => 'macos_x64'
+ }
+
+ spec.script_phases = [
+ {
+ :name => 'Build domain',
+ :execution_position => :before_compile,
+ :shell_path => '/bin/sh',
+ :script => <<-SCRIPT
+ set -ev
+ REPO_ROOT="$PODS_TARGET_SRCROOT"
+ "$REPO_ROOT/../gradlew" -p "$REPO_ROOT" :domain:syncFramework \
+ -Pkotlin.native.cocoapods.target=$KOTLIN_TARGET \
+ -Pkotlin.native.cocoapods.configuration=$CONFIGURATION \
+ -Pkotlin.native.cocoapods.cflags="$OTHER_CFLAGS" \
+ -Pkotlin.native.cocoapods.paths.headers="$HEADER_SEARCH_PATHS" \
+ -Pkotlin.native.cocoapods.paths.frameworks="$FRAMEWORK_SEARCH_PATHS"
+ SCRIPT
+ }
+ ]
+end
\ No newline at end of file
diff --git a/domain/proguard-rules.pro b/domain/proguard-rules.pro
index e69de29..d8c8e9d 100644
--- a/domain/proguard-rules.pro
+++ b/domain/proguard-rules.pro
@@ -0,0 +1,9 @@
+-keepattributes *Annotation*, InnerClasses
+-dontnote kotlinx.serialization.SerializationKt
+-keep,includedescriptorclasses class com.popalay.domain.**$$serializer { *; }
+-keepclassmembers class com.popalay.domain.** {
+ *** Companion;
+}
+-keepclasseswithmembers class com.popalay.domain.** {
+ kotlinx.serialization.KSerializer serializer(...);
+}
\ No newline at end of file
diff --git a/domain/src/androidMain/AndroidManifest.xml b/domain/src/androidMain/AndroidManifest.xml
new file mode 100644
index 0000000..c8d206a
--- /dev/null
+++ b/domain/src/androidMain/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/Dependencies.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Dependencies.kt
similarity index 55%
rename from domain/src/main/java/com/popalay/tracktor/domain/Dependencies.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Dependencies.kt
index ea05768..faec656 100644
--- a/domain/src/main/java/com/popalay/tracktor/domain/Dependencies.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Dependencies.kt
@@ -7,6 +7,12 @@ import com.popalay.tracktor.domain.formatter.ValueRecordFormatterFacade
import com.popalay.tracktor.domain.worker.GetAllCategoriesWorker
import com.popalay.tracktor.domain.worker.GetAllTrackersWorker
import com.popalay.tracktor.domain.worker.GetAllUnitsWorker
+import com.popalay.tracktor.domain.workflow.AppWorkflow
+import com.popalay.tracktor.domain.workflow.CreateTrackerWorkflow
+import com.popalay.tracktor.domain.workflow.FeatureFlagsListWorkflow
+import com.popalay.tracktor.domain.workflow.ListWorkflow
+import com.popalay.tracktor.domain.workflow.SettingsWorkflow
+import com.popalay.tracktor.domain.workflow.TrackerDetailWorkflow
import org.koin.dsl.module
val domainModule = module {
@@ -15,4 +21,10 @@ val domainModule = module {
single { GetAllCategoriesWorker(get()) }
single { setOf(NumberValueRecordFormatter(), TextValueRecordFormatter()) }
single { ValueRecordFormatterFacade(get()) }
+ single { AppWorkflow(get()) }
+ single { ListWorkflow(get(), get(), get(), get(), get()) }
+ single { TrackerDetailWorkflow(get(), get(), get()) }
+ single { FeatureFlagsListWorkflow() }
+ single { CreateTrackerWorkflow(get(), get()) }
+ single { SettingsWorkflow(get()) }
}
\ No newline at end of file
diff --git a/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Koin.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Koin.kt
new file mode 100644
index 0000000..c0496d9
--- /dev/null
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/Koin.kt
@@ -0,0 +1,13 @@
+package com.popalay.tracktor.domain
+
+import com.popalay.tracktor.data.dataModule
+import org.koin.core.context.startKoin
+import org.koin.dsl.KoinAppDeclaration
+
+fun initKoin(appDeclaration: KoinAppDeclaration = {}) = startKoin {
+ appDeclaration()
+ modules(domainModule, dataModule)
+}
+
+// called by iOS etc
+fun initKoin() = initKoin {}
\ No newline at end of file
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/formatter/ValueRecordFormatter.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/formatter/ValueRecordFormatter.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/formatter/ValueRecordFormatter.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/formatter/ValueRecordFormatter.kt
diff --git a/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/CoreExtensions.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/CoreExtensions.kt
new file mode 100644
index 0000000..6768346
--- /dev/null
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/CoreExtensions.kt
@@ -0,0 +1,6 @@
+package com.popalay.tracktor.domain.utils
+
+fun List.updateItem(item: T, newItem: T): List =
+ toMutableList().apply {
+ set(indexOf(item), newItem)
+ }.toList()
\ No newline at end of file
diff --git a/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/WorkflowExtensions.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/WorkflowExtensions.kt
new file mode 100644
index 0000000..8caa8ce
--- /dev/null
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/utils/WorkflowExtensions.kt
@@ -0,0 +1,12 @@
+package com.popalay.tracktor.domain.utils
+
+import com.squareup.workflow.Snapshot
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
+
+@OptIn(ExperimentalStdlibApi::class)
+inline fun T.toSnapshot(): Snapshot = Snapshot.of(Json.encodeToString(this))
+
+@OptIn(ExperimentalStdlibApi::class)
+inline fun Snapshot.toData(): T? = Json.decodeFromString(bytes.utf8())
\ No newline at end of file
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllCategoriesWorker.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllCategoriesWorker.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllCategoriesWorker.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllCategoriesWorker.kt
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllTrackersWorker.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllTrackersWorker.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllTrackersWorker.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllTrackersWorker.kt
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllUnitsWorker.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllUnitsWorker.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/worker/GetAllUnitsWorker.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetAllUnitsWorker.kt
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/worker/GetTrackerByIdWorker.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetTrackerByIdWorker.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/worker/GetTrackerByIdWorker.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/GetTrackerByIdWorker.kt
diff --git a/domain/src/main/java/com/popalay/tracktor/domain/worker/SaveTrackerWorker.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/SaveTrackerWorker.kt
similarity index 100%
rename from domain/src/main/java/com/popalay/tracktor/domain/worker/SaveTrackerWorker.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/worker/SaveTrackerWorker.kt
diff --git a/app/src/main/java/com/popalay/tracktor/AppWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/AppWorkflow.kt
similarity index 90%
rename from app/src/main/java/com/popalay/tracktor/AppWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/AppWorkflow.kt
index 4d4e8b7..f1206ea 100644
--- a/app/src/main/java/com/popalay/tracktor/AppWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/AppWorkflow.kt
@@ -1,6 +1,5 @@
-package com.popalay.tracktor
+package com.popalay.tracktor.domain.workflow
-import com.popalay.tracktor.feature.list.ListWorkflow
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
diff --git a/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/CreateTrackerWorkflow.kt
similarity index 91%
rename from app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/CreateTrackerWorkflow.kt
index 9ba7c8a..0ed42a0 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/CreateTrackerWorkflow.kt
@@ -1,34 +1,32 @@
-package com.popalay.tracktor.feature.createtracker
+package com.popalay.tracktor.domain.workflow
-import androidx.compose.ui.text.input.KeyboardType
+import com.benasher44.uuid.uuid4
import com.popalay.tracktor.data.TrackingRepository
+import com.popalay.tracktor.data.extensions.now
import com.popalay.tracktor.data.model.ProgressDirection
import com.popalay.tracktor.data.model.ProgressDirection.ASCENDING
import com.popalay.tracktor.data.model.TrackableUnit
import com.popalay.tracktor.data.model.Tracker
import com.popalay.tracktor.data.model.UnitValueType
+import com.popalay.tracktor.domain.utils.toData
+import com.popalay.tracktor.domain.utils.toSnapshot
import com.popalay.tracktor.domain.worker.GetAllUnitsWorker
import com.popalay.tracktor.domain.worker.SaveTrackerWorker
-import com.popalay.tracktor.utils.toData
-import com.popalay.tracktor.utils.toSnapshot
-import com.squareup.moshi.JsonClass
-import com.squareup.moshi.Moshi
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
import com.squareup.workflow.WorkflowAction
import com.squareup.workflow.applyTo
-import java.time.LocalDateTime
-import java.util.Locale
-import java.util.UUID
+import kotlinx.datetime.LocalDateTime
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.Transient
class CreateTrackerWorkflow(
private val trackingRepository: TrackingRepository,
- private val getAllUnitsWorker: GetAllUnitsWorker,
- private val moshi: Moshi
+ private val getAllUnitsWorker: GetAllUnitsWorker
) : StatefulWorkflow() {
- @JsonClass(generateAdapter = true)
+ @Serializable
data class State(
val title: String = "",
val selectedUnit: TrackableUnit = TrackableUnit.None,
@@ -41,7 +39,7 @@ class CreateTrackerWorkflow(
val isCustomUnitValueTypeDropdownShown: Boolean = false,
val isCustomUnitValid: Boolean = false,
@Transient val units: List = emptyList(),
- @Transient val initialValueKeyboardType: KeyboardType = KeyboardType.Number,
+ @Transient val initialValueKeyboardType: String = "Number",
@Transient val currentAction: Action? = null
) {
val isValidToSave: Boolean
@@ -100,7 +98,7 @@ class CreateTrackerWorkflow(
is UnitSelected -> nextState.copy(
selectedUnit = action.unit,
selectedProgressDirection = if (action.unit == TrackableUnit.Word) ASCENDING else nextState.selectedProgressDirection,
- initialValueKeyboardType = if (action.unit == TrackableUnit.Word) KeyboardType.Text else KeyboardType.Number,
+ initialValueKeyboardType = if (action.unit == TrackableUnit.Word) "Text" else "Number",
isInitialValueVisible = nextState.title.isNotBlank() && action.unit != TrackableUnit.None,
isCustomUnitCreating = false,
customUnit = TrackableUnit.None
@@ -155,7 +153,7 @@ class CreateTrackerWorkflow(
val onAction: (Action) -> Unit
)
- override fun initialState(props: Unit, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
+ override fun initialState(props: Unit, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
override fun render(
props: Unit,
@@ -171,13 +169,13 @@ class CreateTrackerWorkflow(
)
}
- override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
+ override fun snapshotState(state: State): Snapshot = state.toSnapshot()
private fun runSideEffects(state: State, context: RenderContext) {
if (state.currentAction is Action.SaveClicked) {
val tracker = Tracker(
- id = UUID.randomUUID().toString(),
- title = state.title.trim().capitalize(Locale.getDefault()),
+ id = uuid4().toString(),
+ title = state.title.trim().capitalize(),
unit = state.selectedUnit,
direction = state.selectedProgressDirection,
date = LocalDateTime.now(),
diff --git a/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/FeatureFlagsListWorkflow.kt
similarity index 86%
rename from app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/FeatureFlagsListWorkflow.kt
index 20c112c..8028bed 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/FeatureFlagsListWorkflow.kt
@@ -1,16 +1,14 @@
-package com.popalay.tracktor.feature.featureflagslist
+package com.popalay.tracktor.domain.workflow
-import com.popalay.tracktor.data.featureflags.FeatureFlagsManager
import com.popalay.tracktor.data.model.FeatureFlagListItem
-import com.popalay.tracktor.utils.updateItem
+import com.popalay.tracktor.domain.utils.updateItem
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
import com.squareup.workflow.WorkflowAction
-class FeatureFlagsListWorkflow(
- private val featureFlagsManager: FeatureFlagsManager
-) : StatefulWorkflow() {
+class FeatureFlagsListWorkflow :
+ StatefulWorkflow() {
data class State(
val featureFlags: List = emptyList()
diff --git a/app/src/main/java/com/popalay/tracktor/feature/list/ListWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/ListWorkflow.kt
similarity index 90%
rename from app/src/main/java/com/popalay/tracktor/feature/list/ListWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/ListWorkflow.kt
index 083d5cb..24fd30a 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/list/ListWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/ListWorkflow.kt
@@ -1,4 +1,4 @@
-package com.popalay.tracktor.feature.list
+package com.popalay.tracktor.domain.workflow
import com.popalay.tracktor.data.TrackingRepository
import com.popalay.tracktor.data.model.Category
@@ -8,14 +8,9 @@ import com.popalay.tracktor.data.model.Tracker
import com.popalay.tracktor.data.model.TrackerListItem
import com.popalay.tracktor.data.model.TrackerWithRecords
import com.popalay.tracktor.data.model.toListItem
+import com.popalay.tracktor.domain.utils.toData
+import com.popalay.tracktor.domain.utils.toSnapshot
import com.popalay.tracktor.domain.worker.GetAllTrackersWorker
-import com.popalay.tracktor.feature.createtracker.CreateTrackerWorkflow
-import com.popalay.tracktor.feature.settings.SettingsWorkflow
-import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow
-import com.popalay.tracktor.utils.toData
-import com.popalay.tracktor.utils.toSnapshot
-import com.squareup.moshi.JsonClass
-import com.squareup.moshi.Moshi
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
@@ -23,8 +18,8 @@ import com.squareup.workflow.Worker
import com.squareup.workflow.WorkflowAction
import com.squareup.workflow.applyTo
import com.squareup.workflow.renderChild
-import dev.zacsweers.moshisealed.annotations.DefaultNull
-import dev.zacsweers.moshisealed.annotations.TypeLabel
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.Transient
import org.koin.core.KoinComponent
class ListWorkflow(
@@ -32,8 +27,7 @@ class ListWorkflow(
private val getAllTrackersWorker: GetAllTrackersWorker,
private val trackerDetailWorkflow: TrackerDetailWorkflow,
private val createTrackerWorkflow: CreateTrackerWorkflow,
- private val settingsWorkflow: SettingsWorkflow,
- private val moshi: Moshi
+ private val settingsWorkflow: SettingsWorkflow
) : StatefulWorkflow(), KoinComponent {
companion object {
private const val DELETING_UNDO_TIMEOUT_MILLIS = 4000L
@@ -41,7 +35,7 @@ class ListWorkflow(
object Props
- @JsonClass(generateAdapter = true)
+ @Serializable
data class State(
@Transient val items: List = emptyList(),
@Transient val filteredItems: List = emptyList(),
@@ -56,20 +50,16 @@ class ListWorkflow(
val animate: Boolean = true
)
- @DefaultNull
- @JsonClass(generateAdapter = true, generator = "sealed:type")
+ @Serializable
sealed class ChildState {
- @TypeLabel("TrackerDetail")
- @JsonClass(generateAdapter = true)
+ @Serializable
data class TrackerDetail(val trackerId: String) : ChildState()
- @TypeLabel("Settings")
- @JsonClass(generateAdapter = true)
+ @Serializable
@Suppress("CanSealedSubClassBeObject")
class Settings : ChildState()
- @TypeLabel("TrackerCreation")
- @JsonClass(generateAdapter = true)
+ @Serializable
@Suppress("CanSealedSubClassBeObject")
class TrackerCreation : ChildState()
}
@@ -163,7 +153,7 @@ class ListWorkflow(
.let { if (it.isEmpty()) it else listOf(Category.All).plus(it) }
}
- override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
+ override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
override fun render(
props: Props,
@@ -194,7 +184,7 @@ class ListWorkflow(
}
}
- override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
+ override fun snapshotState(state: State): Snapshot = state.toSnapshot()
private fun runSideEffects(state: State, context: RenderContext) {
when (val action = state.currentAction) {
diff --git a/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/SettingsWorkflow.kt
similarity index 83%
rename from app/src/main/java/com/popalay/tracktor/feature/settings/SettingsWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/SettingsWorkflow.kt
index b3a2823..9beb520 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/settings/SettingsWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/SettingsWorkflow.kt
@@ -1,17 +1,19 @@
-package com.popalay.tracktor.feature.settings
+package com.popalay.tracktor.domain.workflow
-import com.popalay.tracktor.feature.featureflagslist.FeatureFlagsListWorkflow
+import com.popalay.tracktor.domain.utils.toData
+import com.popalay.tracktor.domain.utils.toSnapshot
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
import com.squareup.workflow.WorkflowAction
import com.squareup.workflow.renderChild
-import java.nio.charset.Charset
+import kotlinx.serialization.Serializable
class SettingsWorkflow(
private val featureFlagsListWorkflow: FeatureFlagsListWorkflow
) : StatefulWorkflow() {
+ @Serializable
enum class State {
Root, FeatureFlagsList
}
@@ -40,8 +42,7 @@ class SettingsWorkflow(
val onAction: (Action) -> Unit
)
- override fun initialState(props: Unit, snapshot: Snapshot?) =
- snapshot?.let { State.valueOf(it.bytes.string(Charset.defaultCharset())) } ?: State.Root
+ override fun initialState(props: Unit, snapshot: Snapshot?) = snapshot?.toData() ?: State.Root
override fun render(
props: Unit,
@@ -54,5 +55,5 @@ class SettingsWorkflow(
State.FeatureFlagsList -> context.renderChild(featureFlagsListWorkflow) { Action.FeatureFlagListOutput(it) }
}
- override fun snapshotState(state: State): Snapshot = Snapshot.of(state.name)
+ override fun snapshotState(state: State): Snapshot = state.toSnapshot()
}
\ No newline at end of file
diff --git a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailWorkflow.kt b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/TrackerDetailWorkflow.kt
similarity index 94%
rename from app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailWorkflow.kt
rename to domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/TrackerDetailWorkflow.kt
index 43598ad..5ba13ed 100644
--- a/app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailWorkflow.kt
+++ b/domain/src/commonMain/kotlin/com/popalay/tracktor/domain/workflow/TrackerDetailWorkflow.kt
@@ -1,4 +1,4 @@
-package com.popalay.tracktor.feature.trackerdetail
+package com.popalay.tracktor.domain.workflow
import com.popalay.tracktor.data.CategoryRepository
import com.popalay.tracktor.data.TrackingRepository
@@ -6,24 +6,23 @@ import com.popalay.tracktor.data.model.Category
import com.popalay.tracktor.data.model.TrackableUnit
import com.popalay.tracktor.data.model.TrackerWithRecords
import com.popalay.tracktor.data.model.ValueRecord
+import com.popalay.tracktor.domain.utils.toData
+import com.popalay.tracktor.domain.utils.toSnapshot
import com.popalay.tracktor.domain.worker.GetAllCategoriesWorker
import com.popalay.tracktor.domain.worker.GetTrackerByIdWorker
-import com.popalay.tracktor.utils.toData
-import com.popalay.tracktor.utils.toSnapshot
-import com.squareup.moshi.JsonClass
-import com.squareup.moshi.Moshi
import com.squareup.workflow.RenderContext
import com.squareup.workflow.Snapshot
import com.squareup.workflow.StatefulWorkflow
import com.squareup.workflow.Worker
import com.squareup.workflow.WorkflowAction
import com.squareup.workflow.applyTo
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.Transient
class TrackerDetailWorkflow(
private val trackingRepository: TrackingRepository,
private val categoryRepository: CategoryRepository,
- private val getAllCategoriesWorker: GetAllCategoriesWorker,
- private val moshi: Moshi
+ private val getAllCategoriesWorker: GetAllCategoriesWorker
) : StatefulWorkflow() {
companion object {
private const val DELETING_UNDO_TIMEOUT_MILLIS = 2500L
@@ -31,7 +30,7 @@ class TrackerDetailWorkflow(
data class Props(val trackerId: String)
- @JsonClass(generateAdapter = true)
+ @Serializable
data class State(
val isAddRecordDialogShowing: Boolean = false,
val isAddCategoryDialogShowing: Boolean = false,
@@ -95,7 +94,7 @@ class TrackerDetailWorkflow(
val onAction: (Action) -> Unit
)
- override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
+ override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
override fun render(
props: Props,
@@ -112,7 +111,7 @@ class TrackerDetailWorkflow(
)
}
- override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
+ override fun snapshotState(state: State): Snapshot = state.toSnapshot()
private fun runSideEffects(state: State, context: RenderContext) {
when (val action = state.currentAction) {
diff --git a/domain/src/iosMain/kotlin/com.popalay.tracktor.domain/KoinIOS.kt b/domain/src/iosMain/kotlin/com.popalay.tracktor.domain/KoinIOS.kt
new file mode 100644
index 0000000..00d4374
--- /dev/null
+++ b/domain/src/iosMain/kotlin/com.popalay.tracktor.domain/KoinIOS.kt
@@ -0,0 +1,22 @@
+package com.popalay.tracktor.domain
+
+import kotlinx.cinterop.ObjCClass
+import kotlinx.cinterop.getOriginalKotlinClass
+import org.koin.core.KoinApplication
+import org.koin.core.parameter.parametersOf
+import org.koin.core.qualifier.Qualifier
+import kotlin.native.concurrent.ThreadLocal
+
+@ThreadLocal
+object KoinIOS {
+ private lateinit var koin: KoinApplication
+
+ fun initialize() {
+ koin = initKoin {}
+ }
+
+ fun get(objCClass: ObjCClass, qualifier: Qualifier? = null, parameter: Any? = null): Any? {
+ val kClazz = getOriginalKotlinClass(objCClass)!!
+ return koin.koin.get(kClazz, qualifier) { parametersOf(parameter) }
+ }
+}
\ No newline at end of file
diff --git a/domain/src/main/AndroidManifest.xml b/domain/src/main/AndroidManifest.xml
deleted file mode 100644
index 8ad4187..0000000
--- a/domain/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 9bb6409..15e87cb 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -12,4 +12,8 @@ kapt.use.worker.api=true
kapt.incremental.apt=true
kapt.include.compile.classpath=false
# Run 'aapt optimize' on resources to minimize their APK size impact.
-android.enableResourceOptimizations=true
\ No newline at end of file
+android.enableResourceOptimizations=true
+kotlin.mpp.enableGranularSourceSetsMetadata=true
+kotlin.native.enableDependencyPropagation=false
+
+xcodeproj=./ios/Tracktor
\ No newline at end of file
diff --git a/ios/.gitignore b/ios/.gitignore
new file mode 100644
index 0000000..ba1ff08
--- /dev/null
+++ b/ios/.gitignore
@@ -0,0 +1,90 @@
+# Xcode
+#
+# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
+
+## User settings
+xcuserdata/
+
+## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
+*.xcscmblueprint
+*.xccheckout
+
+## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
+build/
+DerivedData/
+*.moved-aside
+*.pbxuser
+!default.pbxuser
+*.mode1v3
+!default.mode1v3
+*.mode2v3
+!default.mode2v3
+*.perspectivev3
+!default.perspectivev3
+
+## Obj-C/Swift specific
+*.hmap
+
+## App packaging
+*.ipa
+*.dSYM.zip
+*.dSYM
+
+## Playgrounds
+timeline.xctimeline
+playground.xcworkspace
+
+# Swift Package Manager
+#
+# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
+# Packages/
+# Package.pins
+# Package.resolved
+# *.xcodeproj
+#
+# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
+# hence it is not needed unless you have added a package configuration file to your project
+# .swiftpm
+
+.build/
+
+# CocoaPods
+#
+# We recommend against adding the Pods directory to your .gitignore. However
+# you should judge for yourself, the pros and cons are mentioned at:
+# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
+#
+# Pods/
+#
+# Add this line if you want to avoid checking in source code from the Xcode workspace
+# *.xcworkspace
+
+# Carthage
+#
+# Add this line if you want to avoid checking in source code from Carthage dependencies.
+# Carthage/Checkouts
+
+Carthage/Build/
+
+# Accio dependency management
+Dependencies/
+.accio/
+
+# fastlane
+#
+# It is recommended to not store the screenshots in the git repo.
+# Instead, use fastlane to re-generate the screenshots whenever they are needed.
+# For more information about the recommended setup visit:
+# https://docs.fastlane.tools/best-practices/source-control/#source-control
+
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots/**/*.png
+fastlane/test_output
+
+# Code Injection
+#
+# After new code Injection tools there's a generated folder /iOSInjectionProject
+# https://github.com/johnno1962/injectionforxcode
+
+iOSInjectionProject/
\ No newline at end of file
diff --git a/ios/Tracktor/Podfile b/ios/Tracktor/Podfile
new file mode 100644
index 0000000..05ad2c3
--- /dev/null
+++ b/ios/Tracktor/Podfile
@@ -0,0 +1,6 @@
+# Uncomment the next line to define a global platform for your project
+# platform :ios, '9.0'
+
+target 'Tracktor' do
+ pod 'domain', :path => '../../domain'
+end
diff --git a/ios/Tracktor/Podfile.lock b/ios/Tracktor/Podfile.lock
new file mode 100644
index 0000000..ee51590
--- /dev/null
+++ b/ios/Tracktor/Podfile.lock
@@ -0,0 +1,16 @@
+PODS:
+ - domain (1.8)
+
+DEPENDENCIES:
+ - domain (from `../../domain`)
+
+EXTERNAL SOURCES:
+ domain:
+ :path: "../../domain"
+
+SPEC CHECKSUMS:
+ domain: ea70bcae5180c3909f5f408b7f38c8ae275edbe6
+
+PODFILE CHECKSUM: 60ac40290c3224e4542b894e9af5ac5d63948d5f
+
+COCOAPODS: 1.9.3
diff --git a/ios/Tracktor/Pods/Local Podspecs/data.podspec.json b/ios/Tracktor/Pods/Local Podspecs/data.podspec.json
new file mode 100644
index 0000000..dc66f8d
--- /dev/null
+++ b/ios/Tracktor/Pods/Local Podspecs/data.podspec.json
@@ -0,0 +1,39 @@
+{
+ "name": "data",
+ "version": "1.8",
+ "homepage": "Link to a Kotlin/Native module homepage",
+ "source": {
+ "git": "Not Published",
+ "tag": "Cocoapods/data/1.8"
+ },
+ "authors": "",
+ "license": "",
+ "summary": "Shared Data code for Android/iOS",
+ "static_framework": true,
+ "vendored_frameworks": "build/cocoapods/framework/data.framework",
+ "libraries": "c++",
+ "module_name": "data_umbrella",
+ "pod_target_xcconfig": {
+ "KOTLIN_TARGET[sdk=iphonesimulator*]": "ios_x64",
+ "KOTLIN_TARGET[sdk=iphoneos*]": "ios_arm",
+ "KOTLIN_TARGET[sdk=watchsimulator*]": "watchos_x86",
+ "KOTLIN_TARGET[sdk=watchos*]": "watchos_arm",
+ "KOTLIN_TARGET[sdk=appletvsimulator*]": "tvos_x64",
+ "KOTLIN_TARGET[sdk=appletvos*]": "tvos_arm64",
+ "KOTLIN_TARGET[sdk=macosx*]": "macos_x64"
+ },
+ "script_phases": [
+ {
+ "name": "Build data",
+ "execution_position": "before_compile",
+ "shell_path": "/bin/sh",
+ "script": " set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" :data:syncFramework -Pkotlin.native.cocoapods.target=$KOTLIN_TARGET -Pkotlin.native.cocoapods.configuration=$CONFIGURATION -Pkotlin.native.cocoapods.cflags=\"$OTHER_CFLAGS\" -Pkotlin.native.cocoapods.paths.headers=\"$HEADER_SEARCH_PATHS\" -Pkotlin.native.cocoapods.paths.frameworks=\"$FRAMEWORK_SEARCH_PATHS\"\n"
+ }
+ ],
+ "platforms": {
+ "osx": null,
+ "ios": null,
+ "tvos": null,
+ "watchos": null
+ }
+}
diff --git a/ios/Tracktor/Pods/Local Podspecs/domain.podspec.json b/ios/Tracktor/Pods/Local Podspecs/domain.podspec.json
new file mode 100644
index 0000000..1962fa7
--- /dev/null
+++ b/ios/Tracktor/Pods/Local Podspecs/domain.podspec.json
@@ -0,0 +1,39 @@
+{
+ "name": "domain",
+ "version": "1.8",
+ "homepage": "Link to a Kotlin/Native module homepage",
+ "source": {
+ "git": "Not Published",
+ "tag": "Cocoapods/domain/1.8"
+ },
+ "authors": "",
+ "license": "",
+ "summary": "Shared Domain code for Android/iOS",
+ "static_framework": true,
+ "vendored_frameworks": "build/cocoapods/framework/domain.framework",
+ "libraries": "c++",
+ "module_name": "domain_umbrella",
+ "pod_target_xcconfig": {
+ "KOTLIN_TARGET[sdk=iphonesimulator*]": "ios_x64",
+ "KOTLIN_TARGET[sdk=iphoneos*]": "ios_arm",
+ "KOTLIN_TARGET[sdk=watchsimulator*]": "watchos_x86",
+ "KOTLIN_TARGET[sdk=watchos*]": "watchos_arm",
+ "KOTLIN_TARGET[sdk=appletvsimulator*]": "tvos_x64",
+ "KOTLIN_TARGET[sdk=appletvos*]": "tvos_arm64",
+ "KOTLIN_TARGET[sdk=macosx*]": "macos_x64"
+ },
+ "script_phases": [
+ {
+ "name": "Build domain",
+ "execution_position": "before_compile",
+ "shell_path": "/bin/sh",
+ "script": " set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" :domain:syncFramework -Pkotlin.native.cocoapods.target=$KOTLIN_TARGET -Pkotlin.native.cocoapods.configuration=$CONFIGURATION -Pkotlin.native.cocoapods.cflags=\"$OTHER_CFLAGS\" -Pkotlin.native.cocoapods.paths.headers=\"$HEADER_SEARCH_PATHS\" -Pkotlin.native.cocoapods.paths.frameworks=\"$FRAMEWORK_SEARCH_PATHS\"\n"
+ }
+ ],
+ "platforms": {
+ "osx": null,
+ "ios": null,
+ "tvos": null,
+ "watchos": null
+ }
+}
diff --git a/ios/Tracktor/Pods/Manifest.lock b/ios/Tracktor/Pods/Manifest.lock
new file mode 100644
index 0000000..ee51590
--- /dev/null
+++ b/ios/Tracktor/Pods/Manifest.lock
@@ -0,0 +1,16 @@
+PODS:
+ - domain (1.8)
+
+DEPENDENCIES:
+ - domain (from `../../domain`)
+
+EXTERNAL SOURCES:
+ domain:
+ :path: "../../domain"
+
+SPEC CHECKSUMS:
+ domain: ea70bcae5180c3909f5f408b7f38c8ae275edbe6
+
+PODFILE CHECKSUM: 60ac40290c3224e4542b894e9af5ac5d63948d5f
+
+COCOAPODS: 1.9.3
diff --git a/ios/Tracktor/Pods/Pods.xcodeproj/project.pbxproj b/ios/Tracktor/Pods/Pods.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..b22e2eb
--- /dev/null
+++ b/ios/Tracktor/Pods/Pods.xcodeproj/project.pbxproj
@@ -0,0 +1,483 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXAggregateTarget section */
+ 9FA10608F377AE5B47F00969C58A08B0 /* domain */ = {
+ isa = PBXAggregateTarget;
+ buildConfigurationList = 2488B29A83A8B26EB290F84B2EB5142C /* Build configuration list for PBXAggregateTarget "domain" */;
+ buildPhases = (
+ FF04CA46806ACDE24F3FEC826513B7B2 /* [CP-User] Build domain */,
+ );
+ dependencies = (
+ );
+ name = domain;
+ };
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+ F16B72AF37DF5BC467BB1FBFB8D4862F /* Pods-Tracktor-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C362D82DB288C4D3E81130531355504C /* Pods-Tracktor-dummy.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 9B05FF091F4CE5BE97747CB6BCAC2BAD /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 9FA10608F377AE5B47F00969C58A08B0;
+ remoteInfo = domain;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 0755BD899491F86C4FEE27858A7E188A /* Pods-Tracktor-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Tracktor-acknowledgements.markdown"; sourceTree = ""; };
+ 484DF68AF378252599916B928A79C0B9 /* domain.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = domain.framework; path = build/cocoapods/framework/domain.framework; sourceTree = ""; };
+ 5F9E68D84416997717866BB15D02E300 /* Pods-Tracktor.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tracktor.debug.xcconfig"; sourceTree = ""; };
+ 6C2C3A81479A07A950E66238178B9788 /* Pods-Tracktor-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Tracktor-acknowledgements.plist"; sourceTree = ""; };
+ 8647DFB4A8C34A6474781D69FF1BEE26 /* libPods-Tracktor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-Tracktor.a"; path = "libPods-Tracktor.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8693670C514562DCC3B22D6300D1C708 /* Pods-Tracktor.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Tracktor.release.xcconfig"; sourceTree = ""; };
+ 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+ A2DCA9DA2C02602A304FB9CDB95CEB66 /* domain.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = domain.debug.xcconfig; sourceTree = ""; };
+ C362D82DB288C4D3E81130531355504C /* Pods-Tracktor-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Tracktor-dummy.m"; sourceTree = ""; };
+ DB231245BC4AE0D93829011229EE0782 /* domain.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = domain.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
+ F7D4C9534081CA4409E927DAF80B8801 /* domain.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = domain.release.xcconfig; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 3A3D337477BE1872AD581DA0502C7A9B /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 2B1DCF5C3E218E07ED54BB9236513255 /* domain */ = {
+ isa = PBXGroup;
+ children = (
+ 62A61350DCFAA6615D00A5747428CE6E /* Frameworks */,
+ B33EC282BA44AB6AC7F6AF95E7F38210 /* Pod */,
+ FEF685586F27EB77A81264203F99859A /* Support Files */,
+ );
+ name = domain;
+ path = ../../../domain;
+ sourceTree = "";
+ };
+ 3917991DFB737B466A456B7E96C8AB8E /* Pods-Tracktor */ = {
+ isa = PBXGroup;
+ children = (
+ 0755BD899491F86C4FEE27858A7E188A /* Pods-Tracktor-acknowledgements.markdown */,
+ 6C2C3A81479A07A950E66238178B9788 /* Pods-Tracktor-acknowledgements.plist */,
+ C362D82DB288C4D3E81130531355504C /* Pods-Tracktor-dummy.m */,
+ 5F9E68D84416997717866BB15D02E300 /* Pods-Tracktor.debug.xcconfig */,
+ 8693670C514562DCC3B22D6300D1C708 /* Pods-Tracktor.release.xcconfig */,
+ );
+ name = "Pods-Tracktor";
+ path = "Target Support Files/Pods-Tracktor";
+ sourceTree = "";
+ };
+ 4B4D4BB9647E2F04F31C7A2D822504DD /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8647DFB4A8C34A6474781D69FF1BEE26 /* libPods-Tracktor.a */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 62A61350DCFAA6615D00A5747428CE6E /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 484DF68AF378252599916B928A79C0B9 /* domain.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 6ED9B8ECD97E1DB16F5AD6D6BEA1DB8C /* Targets Support Files */ = {
+ isa = PBXGroup;
+ children = (
+ 3917991DFB737B466A456B7E96C8AB8E /* Pods-Tracktor */,
+ );
+ name = "Targets Support Files";
+ sourceTree = "";
+ };
+ B33EC282BA44AB6AC7F6AF95E7F38210 /* Pod */ = {
+ isa = PBXGroup;
+ children = (
+ DB231245BC4AE0D93829011229EE0782 /* domain.podspec */,
+ );
+ name = Pod;
+ sourceTree = "";
+ };
+ B9C327F7CF529138020D4E0300828EAA /* Development Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 2B1DCF5C3E218E07ED54BB9236513255 /* domain */,
+ );
+ name = "Development Pods";
+ sourceTree = "";
+ };
+ CF1408CF629C7361332E53B88F7BD30C = {
+ isa = PBXGroup;
+ children = (
+ 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
+ B9C327F7CF529138020D4E0300828EAA /* Development Pods */,
+ D89477F20FB1DE18A04690586D7808C4 /* Frameworks */,
+ 4B4D4BB9647E2F04F31C7A2D822504DD /* Products */,
+ 6ED9B8ECD97E1DB16F5AD6D6BEA1DB8C /* Targets Support Files */,
+ );
+ sourceTree = "";
+ };
+ D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ FEF685586F27EB77A81264203F99859A /* Support Files */ = {
+ isa = PBXGroup;
+ children = (
+ A2DCA9DA2C02602A304FB9CDB95CEB66 /* domain.debug.xcconfig */,
+ F7D4C9534081CA4409E927DAF80B8801 /* domain.release.xcconfig */,
+ );
+ name = "Support Files";
+ path = "../ios/Tracktor/Pods/Target Support Files/domain";
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ 35B7C8A0BEF75C8B3ACE952501F60E24 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ AF9B6295499CB69545841EACD7912BD5 /* Pods-Tracktor */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 549FF4578058C3BAF4AF079DC8C70B83 /* Build configuration list for PBXNativeTarget "Pods-Tracktor" */;
+ buildPhases = (
+ 35B7C8A0BEF75C8B3ACE952501F60E24 /* Headers */,
+ 83C1831BC0C5CEB0B60DC0757C1ADE65 /* Sources */,
+ 3A3D337477BE1872AD581DA0502C7A9B /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 395E888334ED0E9BE9EC399BB1AF1392 /* PBXTargetDependency */,
+ );
+ name = "Pods-Tracktor";
+ productName = "Pods-Tracktor";
+ productReference = 8647DFB4A8C34A6474781D69FF1BEE26 /* libPods-Tracktor.a */;
+ productType = "com.apple.product-type.library.static";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1100;
+ LastUpgradeCheck = 1100;
+ };
+ buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = CF1408CF629C7361332E53B88F7BD30C;
+ productRefGroup = 4B4D4BB9647E2F04F31C7A2D822504DD /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 9FA10608F377AE5B47F00969C58A08B0 /* domain */,
+ AF9B6295499CB69545841EACD7912BD5 /* Pods-Tracktor */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ FF04CA46806ACDE24F3FEC826513B7B2 /* [CP-User] Build domain */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ name = "[CP-User] Build domain";
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = " set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" :domain:syncFramework -Pkotlin.native.cocoapods.target=$KOTLIN_TARGET -Pkotlin.native.cocoapods.configuration=$CONFIGURATION -Pkotlin.native.cocoapods.cflags=\"$OTHER_CFLAGS\" -Pkotlin.native.cocoapods.paths.headers=\"$HEADER_SEARCH_PATHS\" -Pkotlin.native.cocoapods.paths.frameworks=\"$FRAMEWORK_SEARCH_PATHS\"\n";
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 83C1831BC0C5CEB0B60DC0757C1ADE65 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ F16B72AF37DF5BC467BB1FBFB8D4862F /* Pods-Tracktor-dummy.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 395E888334ED0E9BE9EC399BB1AF1392 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = domain;
+ target = 9FA10608F377AE5B47F00969C58A08B0 /* domain */;
+ targetProxy = 9B05FF091F4CE5BE97747CB6BCAC2BAD /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 8A3650F6C8AC2EFFA814EA61C37468B1 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "POD_CONFIGURATION_DEBUG=1",
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ STRIP_INSTALLED_PRODUCT = NO;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ SYMROOT = "${SRCROOT}/../build";
+ };
+ name = Debug;
+ };
+ 90A45705EC290DD6C31000E9A04766F4 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = F7D4C9534081CA4409E927DAF80B8801 /* domain.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_WEAK = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ AF1F8D2941B0228930706FA0F2C9BB78 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "POD_CONFIGURATION_RELEASE=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ STRIP_INSTALLED_PRODUCT = NO;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ SWIFT_VERSION = 5.0;
+ SYMROOT = "${SRCROOT}/../build";
+ };
+ name = Release;
+ };
+ C831F207CC904CFE5F3E4000E5BCC9D6 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = A2DCA9DA2C02602A304FB9CDB95CEB66 /* domain.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_OBJC_WEAK = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ IPHONEOS_DEPLOYMENT_TARGET = 4.3;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ DA41A28CF6D688154D4A2EAF8BFD984B /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 8693670C514562DCC3B22D6300D1C708 /* Pods-Tracktor.release.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+ CLANG_ENABLE_OBJC_WEAK = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MACH_O_TYPE = staticlib;
+ OTHER_LDFLAGS = "";
+ OTHER_LIBTOOLFLAGS = "";
+ PODS_ROOT = "$(SRCROOT)";
+ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ F7CEDC5835B8A3B05D49EB10912FBA52 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5F9E68D84416997717866BB15D02E300 /* Pods-Tracktor.debug.xcconfig */;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+ CLANG_ENABLE_OBJC_WEAK = NO;
+ CODE_SIGN_IDENTITY = "iPhone Developer";
+ "CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
+ "CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MACH_O_TYPE = staticlib;
+ OTHER_LDFLAGS = "";
+ OTHER_LIBTOOLFLAGS = "";
+ PODS_ROOT = "$(SRCROOT)";
+ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
+ SDKROOT = iphoneos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 2488B29A83A8B26EB290F84B2EB5142C /* Build configuration list for PBXAggregateTarget "domain" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C831F207CC904CFE5F3E4000E5BCC9D6 /* Debug */,
+ 90A45705EC290DD6C31000E9A04766F4 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8A3650F6C8AC2EFFA814EA61C37468B1 /* Debug */,
+ AF1F8D2941B0228930706FA0F2C9BB78 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 549FF4578058C3BAF4AF079DC8C70B83 /* Build configuration list for PBXNativeTarget "Pods-Tracktor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ F7CEDC5835B8A3B05D49EB10912FBA52 /* Debug */,
+ DA41A28CF6D688154D4A2EAF8BFD984B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+}
diff --git a/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.markdown b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.markdown
new file mode 100644
index 0000000..102af75
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.markdown
@@ -0,0 +1,3 @@
+# Acknowledgements
+This application makes use of the following third party libraries:
+Generated by CocoaPods - https://cocoapods.org
diff --git a/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.plist b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.plist
new file mode 100644
index 0000000..7acbad1
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-acknowledgements.plist
@@ -0,0 +1,29 @@
+
+
+
+
+ PreferenceSpecifiers
+
+
+ FooterText
+ This application makes use of the following third party libraries:
+ Title
+ Acknowledgements
+ Type
+ PSGroupSpecifier
+
+
+ FooterText
+ Generated by CocoaPods - https://cocoapods.org
+ Title
+
+ Type
+ PSGroupSpecifier
+
+
+ StringsTable
+ Acknowledgements
+ Title
+ Acknowledgements
+
+
diff --git a/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-dummy.m b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-dummy.m
new file mode 100644
index 0000000..12e2a56
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor-dummy.m
@@ -0,0 +1,5 @@
+#import
+@interface PodsDummy_Pods_Tracktor : NSObject
+@end
+@implementation PodsDummy_Pods_Tracktor
+@end
diff --git a/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.debug.xcconfig b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.debug.xcconfig
new file mode 100644
index 0000000..1e10982
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.debug.xcconfig
@@ -0,0 +1,8 @@
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../domain/build/cocoapods/framework"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "domain"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
+PODS_ROOT = ${SRCROOT}/Pods
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.release.xcconfig b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.release.xcconfig
new file mode 100644
index 0000000..1e10982
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/Pods-Tracktor/Pods-Tracktor.release.xcconfig
@@ -0,0 +1,8 @@
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../domain/build/cocoapods/framework"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "domain"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
+PODS_ROOT = ${SRCROOT}/Pods
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/ios/Tracktor/Pods/Target Support Files/domain/domain.debug.xcconfig b/ios/Tracktor/Pods/Target Support Files/domain/domain.debug.xcconfig
new file mode 100644
index 0000000..b9f26ec
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/domain/domain.debug.xcconfig
@@ -0,0 +1,17 @@
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/domain
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../domain/build/cocoapods/framework"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+KOTLIN_TARGET[sdk=appletvos*] = tvos_arm64
+KOTLIN_TARGET[sdk=appletvsimulator*] = tvos_x64
+KOTLIN_TARGET[sdk=iphoneos*] = ios_arm
+KOTLIN_TARGET[sdk=iphonesimulator*] = ios_x64
+KOTLIN_TARGET[sdk=macosx*] = macos_x64
+KOTLIN_TARGET[sdk=watchos*] = watchos_arm
+KOTLIN_TARGET[sdk=watchsimulator*] = watchos_x86
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../../domain
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/ios/Tracktor/Pods/Target Support Files/domain/domain.release.xcconfig b/ios/Tracktor/Pods/Target Support Files/domain/domain.release.xcconfig
new file mode 100644
index 0000000..b9f26ec
--- /dev/null
+++ b/ios/Tracktor/Pods/Target Support Files/domain/domain.release.xcconfig
@@ -0,0 +1,17 @@
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/domain
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../domain/build/cocoapods/framework"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+KOTLIN_TARGET[sdk=appletvos*] = tvos_arm64
+KOTLIN_TARGET[sdk=appletvsimulator*] = tvos_x64
+KOTLIN_TARGET[sdk=iphoneos*] = ios_arm
+KOTLIN_TARGET[sdk=iphonesimulator*] = ios_x64
+KOTLIN_TARGET[sdk=macosx*] = macos_x64
+KOTLIN_TARGET[sdk=watchos*] = watchos_arm
+KOTLIN_TARGET[sdk=watchsimulator*] = watchos_x86
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../../domain
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/ios/Tracktor/Tracktor.xcodeproj/project.pbxproj b/ios/Tracktor/Tracktor.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..c96fb69
--- /dev/null
+++ b/ios/Tracktor/Tracktor.xcodeproj/project.pbxproj
@@ -0,0 +1,395 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 50;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 448071F474B9D163472A4D3C /* libPods-Tracktor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F5072A0417F55EC81FAFB2E /* libPods-Tracktor.a */; };
+ 75C811AB25136BBF006AD459 /* TracktorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C811AA25136BBF006AD459 /* TracktorApp.swift */; };
+ 75C811AD25136BBF006AD459 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C811AC25136BBF006AD459 /* ContentView.swift */; };
+ 75C811AF25136BC0006AD459 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75C811AE25136BC0006AD459 /* Assets.xcassets */; };
+ 75C811B225136BC0006AD459 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 75C811B125136BC0006AD459 /* Preview Assets.xcassets */; };
+ 75C811BA25146D16006AD459 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75C811B925146D16006AD459 /* AppDelegate.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 0F5072A0417F55EC81FAFB2E /* libPods-Tracktor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Tracktor.a"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 39FECF104626264E5121632A /* Pods-Tracktor.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tracktor.debug.xcconfig"; path = "Target Support Files/Pods-Tracktor/Pods-Tracktor.debug.xcconfig"; sourceTree = ""; };
+ 3A712CCE76B9F9EBA4DDCF78 /* Pods-Tracktor.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tracktor.release.xcconfig"; path = "Target Support Files/Pods-Tracktor/Pods-Tracktor.release.xcconfig"; sourceTree = ""; };
+ 75C811A725136BBF006AD459 /* Tracktor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Tracktor.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 75C811AA25136BBF006AD459 /* TracktorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TracktorApp.swift; sourceTree = ""; };
+ 75C811AC25136BBF006AD459 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
+ 75C811AE25136BC0006AD459 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 75C811B125136BC0006AD459 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
+ 75C811B325136BC0006AD459 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 75C811B925146D16006AD459 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 75C811A425136BBF006AD459 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 448071F474B9D163472A4D3C /* libPods-Tracktor.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 3657C2FFA4C06775A2618E17 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 0F5072A0417F55EC81FAFB2E /* libPods-Tracktor.a */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 75C8119E25136BBF006AD459 = {
+ isa = PBXGroup;
+ children = (
+ 75C811A925136BBF006AD459 /* Tracktor */,
+ 75C811A825136BBF006AD459 /* Products */,
+ E074D980EC4DF9006A1274A7 /* Pods */,
+ 3657C2FFA4C06775A2618E17 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 75C811A825136BBF006AD459 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 75C811A725136BBF006AD459 /* Tracktor.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 75C811A925136BBF006AD459 /* Tracktor */ = {
+ isa = PBXGroup;
+ children = (
+ 75C811AA25136BBF006AD459 /* TracktorApp.swift */,
+ 75C811AC25136BBF006AD459 /* ContentView.swift */,
+ 75C811AE25136BC0006AD459 /* Assets.xcassets */,
+ 75C811B325136BC0006AD459 /* Info.plist */,
+ 75C811B025136BC0006AD459 /* Preview Content */,
+ 75C811B925146D16006AD459 /* AppDelegate.swift */,
+ );
+ path = Tracktor;
+ sourceTree = "";
+ };
+ 75C811B025136BC0006AD459 /* Preview Content */ = {
+ isa = PBXGroup;
+ children = (
+ 75C811B125136BC0006AD459 /* Preview Assets.xcassets */,
+ );
+ path = "Preview Content";
+ sourceTree = "";
+ };
+ E074D980EC4DF9006A1274A7 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ 39FECF104626264E5121632A /* Pods-Tracktor.debug.xcconfig */,
+ 3A712CCE76B9F9EBA4DDCF78 /* Pods-Tracktor.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 75C811A625136BBF006AD459 /* Tracktor */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 75C811B625136BC0006AD459 /* Build configuration list for PBXNativeTarget "Tracktor" */;
+ buildPhases = (
+ A33B0DB3B7EB98F22ECB8122 /* [CP] Check Pods Manifest.lock */,
+ 75C811A325136BBF006AD459 /* Sources */,
+ 75C811A425136BBF006AD459 /* Frameworks */,
+ 75C811A525136BBF006AD459 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Tracktor;
+ productName = Tracktor;
+ productReference = 75C811A725136BBF006AD459 /* Tracktor.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 75C8119F25136BBF006AD459 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastSwiftUpdateCheck = 1200;
+ LastUpgradeCheck = 1200;
+ TargetAttributes = {
+ 75C811A625136BBF006AD459 = {
+ CreatedOnToolsVersion = 12.0;
+ };
+ };
+ };
+ buildConfigurationList = 75C811A225136BBF006AD459 /* Build configuration list for PBXProject "Tracktor" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 75C8119E25136BBF006AD459;
+ productRefGroup = 75C811A825136BBF006AD459 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 75C811A625136BBF006AD459 /* Tracktor */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 75C811A525136BBF006AD459 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 75C811B225136BC0006AD459 /* Preview Assets.xcassets in Resources */,
+ 75C811AF25136BC0006AD459 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ A33B0DB3B7EB98F22ECB8122 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Tracktor-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 75C811A325136BBF006AD459 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 75C811BA25146D16006AD459 /* AppDelegate.swift in Sources */,
+ 75C811AD25136BBF006AD459 /* ContentView.swift in Sources */,
+ 75C811AB25136BBF006AD459 /* TracktorApp.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+ 75C811B425136BC0006AD459 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 75C811B525136BC0006AD459 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 75C811B725136BC0006AD459 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 39FECF104626264E5121632A /* Pods-Tracktor.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_ASSET_PATHS = "\"Tracktor/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ INFOPLIST_FILE = Tracktor/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-lsqlite3",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.popalay.Tracktor;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 75C811B825136BC0006AD459 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 3A712CCE76B9F9EBA4DDCF78 /* Pods-Tracktor.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ DEVELOPMENT_ASSET_PATHS = "\"Tracktor/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ INFOPLIST_FILE = Tracktor/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ OTHER_LDFLAGS = (
+ "$(inherited)",
+ "-lsqlite3",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.popalay.Tracktor;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 75C811A225136BBF006AD459 /* Build configuration list for PBXProject "Tracktor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 75C811B425136BC0006AD459 /* Debug */,
+ 75C811B525136BC0006AD459 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 75C811B625136BC0006AD459 /* Build configuration list for PBXNativeTarget "Tracktor" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 75C811B725136BC0006AD459 /* Debug */,
+ 75C811B825136BC0006AD459 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 75C8119F25136BBF006AD459 /* Project object */;
+}
diff --git a/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Tracktor/Tracktor.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Tracktor/Tracktor.xcworkspace/contents.xcworkspacedata b/ios/Tracktor/Tracktor.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..212cd99
--- /dev/null
+++ b/ios/Tracktor/Tracktor.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/ios/Tracktor/Tracktor.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Tracktor/Tracktor.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/ios/Tracktor/Tracktor.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/ios/Tracktor/Tracktor/AppDelegate.swift b/ios/Tracktor/Tracktor/AppDelegate.swift
new file mode 100644
index 0000000..4e7055a
--- /dev/null
+++ b/ios/Tracktor/Tracktor/AppDelegate.swift
@@ -0,0 +1,16 @@
+//
+// AppDelegate.swift
+// Tracktor
+//
+// Created by Denys Nykyforov on 18/9/20.
+//
+
+import UIKit
+import domain
+
+class AppDelegate: NSObject, UIApplicationDelegate {
+ func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
+ KoinIOS().initialize()
+ return true
+ }
+}
diff --git a/ios/Tracktor/Tracktor/Assets.xcassets/AccentColor.colorset/Contents.json b/ios/Tracktor/Tracktor/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/ios/Tracktor/Tracktor/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Tracktor/Tracktor/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Tracktor/Tracktor/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..9221b9b
--- /dev/null
+++ b/ios/Tracktor/Tracktor/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,98 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "2x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "iphone",
+ "scale" : "3x",
+ "size" : "60x60"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "20x20"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "29x29"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "40x40"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "1x",
+ "size" : "76x76"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "76x76"
+ },
+ {
+ "idiom" : "ipad",
+ "scale" : "2x",
+ "size" : "83.5x83.5"
+ },
+ {
+ "idiom" : "ios-marketing",
+ "scale" : "1x",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Tracktor/Tracktor/Assets.xcassets/Contents.json b/ios/Tracktor/Tracktor/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/ios/Tracktor/Tracktor/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Tracktor/Tracktor/ContentView.swift b/ios/Tracktor/Tracktor/ContentView.swift
new file mode 100644
index 0000000..86fb06b
--- /dev/null
+++ b/ios/Tracktor/Tracktor/ContentView.swift
@@ -0,0 +1,22 @@
+//
+// ContentView.swift
+// Tracktor
+//
+// Created by Denys Nykyforov on 17/9/20.
+//
+
+import SwiftUI
+import domain
+
+struct ContentView: View {
+ var repo = KoinIOS().get(objCClass: DataTrackingRepository.self, qualifier: nil, parameter: nil) as! DataTrackingRepository
+ var body: some View {
+ Text(repo.getTextFromSharedModule()).padding()
+ }
+}
+
+struct ContentView_Previews: PreviewProvider {
+ static var previews: some View {
+ ContentView()
+ }
+}
diff --git a/ios/Tracktor/Tracktor/Info.plist b/ios/Tracktor/Tracktor/Info.plist
new file mode 100644
index 0000000..efc211a
--- /dev/null
+++ b/ios/Tracktor/Tracktor/Info.plist
@@ -0,0 +1,50 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ $(PRODUCT_NAME)
+ CFBundlePackageType
+ $(PRODUCT_BUNDLE_PACKAGE_TYPE)
+ CFBundleShortVersionString
+ 1.0
+ CFBundleVersion
+ 1
+ LSRequiresIPhoneOS
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UILaunchScreen
+
+ UIRequiredDeviceCapabilities
+
+ armv7
+
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+
+
diff --git a/ios/Tracktor/Tracktor/Preview Content/Preview Assets.xcassets/Contents.json b/ios/Tracktor/Tracktor/Preview Content/Preview Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/ios/Tracktor/Tracktor/Preview Content/Preview Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/ios/Tracktor/Tracktor/TracktorApp.swift b/ios/Tracktor/Tracktor/TracktorApp.swift
new file mode 100644
index 0000000..4cd101a
--- /dev/null
+++ b/ios/Tracktor/Tracktor/TracktorApp.swift
@@ -0,0 +1,19 @@
+//
+// TracktorApp.swift
+// Tracktor
+//
+// Created by Denys Nykyforov on 17/9/20.
+//
+
+import SwiftUI
+
+@main
+struct TracktorApp: App {
+ @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
+
+ var body: some Scene {
+ WindowGroup {
+ ContentView()
+ }
+ }
+}
diff --git a/settings.gradle.kts b/settings.gradle.kts
index f844600..7e7dba7 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,24 +1,30 @@
import java.net.URI
-rootProject.name = "Tracktor"
-
include(":app")
include(":data")
include(":core")
include(":domain")
+rootProject.name = "Tracktor"
+
+enableFeaturePreview("GRADLE_METADATA")
+
if (System.getenv("CI") != "true") {
- includeBuild("../workflow-kotlin-compose") {
+ includeBuild("../workflow") {
dependencySubstitution {
- substitute(module("com.squareup.workflow:workflow-ui-core-compose")).with(project(":core-compose"))
- substitute(module("om.squareup.workflow:workflow-ui-compose-tooling")).with(project(":compose-tooling"))
+ substitute(module("com.squareup.workflow:core-compose")).with(project(":core-compose"))
+ substitute(module("com.squareup.workflow:compose-tooling")).with(project(":compose-tooling"))
+ substitute(module("com.squareup.workflow:workflow-core")).with(project(":workflow-core"))
+ substitute(module("com.squareup.workflow:workflow-runtime")).with(project(":workflow-runtime"))
}
}
} else {
sourceControl {
- gitRepository(URI("https://github.com/Popalay/workflow-kotlin-compose.git")) {
+ gitRepository(URI("https://github.com/Popalay/workflow.git")) {
producesModule("com.squareup.workflow:core-compose")
producesModule("com.squareup.workflow:compose-tooling")
+ producesModule("com.squareup.workflow:workflow-core")
+ producesModule("com.squareup.workflow:workflow-runtime")
}
}
}
@@ -27,6 +33,7 @@ pluginManagement {
repositories {
maven(url = "https://dl.bintray.com/kotlin/kotlin-eap/")
gradlePluginPortal()
+ mavenCentral()
jcenter()
google()
}