Skip to content

Commit

Permalink
Replace Realm to Room and up Kotlin to 2.0.20-beta02 (#245)
Browse files Browse the repository at this point in the history
* Add Room to replace Realm

* Remove Realm and update Kotlin
  • Loading branch information
phansier committed Jul 16, 2024
1 parent 88710ec commit 40549ad
Show file tree
Hide file tree
Showing 23 changed files with 232 additions and 157 deletions.
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ SHELL := /bin/bash

path := ./

params := --console=plain

detekt:
$(path)gradlew detektAll

Expand All @@ -21,7 +23,7 @@ buildAndroid:
testCommon:
./gradlew :cmp-common:testDebugUnitTest

localCheck: detekt buildApp buildWear buildAndroid testCommon
localCheck: detekt buildApp buildWear buildAndroid testCommon $(params)

compose_metrics:
$(path)gradlew :app:assembleRelease \-Pmyapp.enableComposeCompilerReports=true
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![Compose Version](https://img.shields.io/badge/Jetpack%20Compose-1.6.8-yellow)](https://developer.android.com/jetpack/compose)
[![Compose Version](https://img.shields.io/badge/Compose%20Multiplatform-1.6.11-yellow)](https://github.com/JetBrains/compose-multiplatform)
[![WearCompose Version](https://img.shields.io/badge/Wear%20Compose-1.3.1-yellow)](https://developer.android.com/jetpack/androidx/releases/wear-compose)
[![Kotlin Version](https://img.shields.io/badge/Kotlin-2.0.0-blue.svg)](https://kotlinlang.org)
[![Kotlin Version](https://img.shields.io/badge/Kotlin-2.0.20--Beta2-blue.svg)](https://kotlinlang.org)
![Android CI](https://github.com/phansier/Coffeegram/workflows/Android%20CI/badge.svg?branch=master)
[![Jetc.dev](https://img.shields.io/badge/jetc.dev-25-blue)](https://jetc.dev/issues/025.html)
[![Hits-of-Code](https://hitsofcode.com/github/phansier/Coffeegram?branch=develop)](https://hitsofcode.com/github/phansier/Coffeegram/view?branch=develop)
Expand All @@ -28,7 +28,7 @@

- Jetpack Datastore

- Realm Multiplatform as an database
- Room Multiplatform as an database

<img src="images/month_table.png" alt="drawing" width="200"/>
<img src="images/coffee_list.png" alt="drawing" width="200"/>
Expand Down
13 changes: 11 additions & 2 deletions app/src/main/java/ru/beryukhov/coffeegram/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ import org.koin.android.ext.koin.androidContext
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.context.startKoin
import org.koin.dsl.module
import repository.CoffeeRepository
import repository.RoomCoffeeRepository
import repository.room.roomModule
import ru.beryukhov.coffeegram.model.DaysCoffeesStore
import ru.beryukhov.coffeegram.model.HeavyDaysCoffeesStore
import ru.beryukhov.coffeegram.model.NavigationStore
Expand All @@ -16,6 +19,7 @@ import ru.beryukhov.coffeegram.model.ThemeStore
import ru.beryukhov.coffeegram.pages.CoffeeListViewModelImpl
import ru.beryukhov.coffeegram.pages.MapPageViewModelImpl
import ru.beryukhov.coffeegram.pages.TablePageViewModelImpl
import ru.beryukhov.coffeegram.repository.CoffeeStorage
import ru.beryukhov.coffeegram.repository.ThemeDataStoreProtoStorage
import ru.beryukhov.coffeegram.store_lib.Storage
import ru.beryukhov.coffeegram.widget.FirstGlanceWidget
Expand All @@ -30,7 +34,9 @@ class Application : Application() {
single {
ThemeStore(get())
}
single<DaysCoffeesStore> { HeavyDaysCoffeesStore() }
single<CoffeeRepository> { RoomCoffeeRepository(get()) }
single<CoffeeStorage> { CoffeeStorage(get()) }
single<DaysCoffeesStore> { HeavyDaysCoffeesStore(get()) }
// single<DaysCoffeesStore> { LightDaysCoffeesStore() }
single { NavigationStore() }
viewModel { CoffeeListViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) }
Expand All @@ -42,7 +48,10 @@ class Application : Application() {
super.onCreate()
startKoin {
androidContext(this@Application)
modules(appModule)
modules(
appModule,
roomModule()
)
}
// causes java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken
// or in a snapshot that has not yet been applied
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import ru.beryukhov.coffeegram.store_lib.Store

interface DaysCoffeesStore : Store<DaysCoffeesIntent, DaysCoffeesState>

class HeavyDaysCoffeesStore : PersistentStore<DaysCoffeesIntent, DaysCoffeesState>(
class HeavyDaysCoffeesStore(storage: CoffeeStorage) : PersistentStore<DaysCoffeesIntent, DaysCoffeesState>(
initialState = DaysCoffeesState(),
storage = CoffeeStorage()
storage = storage
), DaysCoffeesStore {

override fun handleIntent(intent: DaysCoffeesIntent): DaysCoffeesState {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ import ru.beryukhov.coffeegram.data.DayCoffee
import ru.beryukhov.coffeegram.model.DaysCoffeesState
import ru.beryukhov.coffeegram.store_lib.Storage

val lazy_repository: CoffeeRepository by lazy { CoffeeRepository() }

class CoffeeStorage(private val repository: CoffeeRepository = lazy_repository) :
class CoffeeStorage(private val repository: CoffeeRepository) :
Storage<DaysCoffeesState> {
override suspend fun getState(): DaysCoffeesState {
return repository.getAll().toState()
Expand Down
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ buildscript {
dependencies {
classpath(libs.androidGradle)
classpath(libs.kotlinGradle)
classpath(libs.realmGradle)
classpath(libs.roomGradle)
classpath(libs.ksp)

classpath(libs.composeGradle)
classpath(libs.sqldelightGradle)
Expand Down
23 changes: 0 additions & 23 deletions cmp-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,10 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat

plugins {
kotlin("multiplatform")
// kotlin("native.cocoapods")
id("com.android.library")
id("org.jetbrains.compose")
id("org.jetbrains.kotlin.plugin.compose")

id("co.touchlab.kmmbridge") version "0.5.5"
`maven-publish`
}

Expand All @@ -21,20 +19,6 @@ kotlin {
iosArm64()
iosSimulatorArm64()

// cocoapods {
// version = "1.0.0"
// summary = "Some description for the Shared Module"
// homepage = "https://github.com/phansier/Coffeegram"
// ios.deploymentTarget = "14.1"
// podfile = project.file("../cmp-iosApp/Podfile")
// framework {
// baseName = "cmp_common"
// isStatic = true
// }
// extraSpecAttributes["resources"] = "['src/commonMain/resources/**', 'src/iosMain/resources/**']"
// extraSpecAttributes["resources"] = "['src/commonMain/resources/**']"
// }

sourceSets {
commonMain.dependencies {
api(compose.runtime)
Expand Down Expand Up @@ -121,10 +105,3 @@ compose.desktop {
}
}
}

kmmbridge {
mavenPublishArtifacts()
spm()
// cocoapods("git@github.com:phansier/PodSpecs.git")
addGithubPackagesRepository()
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.Context
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.driver.android.AndroidSqliteDriver

lateinit var context: Context // todo fill it
lateinit var context: Context // todo fill it with koin instead

internal actual class DriverFactory {
actual fun createDriver(): SqlDriver {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,7 @@
@file:Suppress("MatchingDeclarationName")

package repository.model

import ru.beryukhov.repository.SqlDayCoffee

data class DbDayCoffee(val date: String, val coffeeName: String, val count: Int)

internal fun DbDayCoffee.toRealm(): SqlDayCoffee {
val dc = this
return SqlDayCoffee(
date = dc.date,
coffeeName = dc.coffeeName,
count = dc.count.toLong(),
)
}

internal fun SqlDayCoffee.toDb() = DbDayCoffee(date = date, coffeeName = coffeeName, count = count.toInt())
2 changes: 0 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,3 @@ compose.desktop.verbose=true

org.jetbrains.compose.experimental.uikit.enabled=true
kotlin.mpp.enableCInteropCommonization=true

kotlin.experimental.tryK2=true #left for realm plugin
16 changes: 12 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ compileSdk = "34"
minSdk = "24"
wearMinSdk = "25"

kotlin = "2.0.0" # https://kotlinlang.org/docs/releases.html#release-details
kotlin = "2.0.20-Beta2" # https://kotlinlang.org/docs/releases.html#release-details
agp = "8.5.1" # https://developer.android.com/studio/releases/gradle-plugin
realm = "2.0.0" # https://github.com/realm/realm-kotlin
ktor = "2.3.12" # https://github.com/ktorio/ktor
androidxRoom = "2.7.0-alpha05" # https://developer.android.com/jetpack/androidx/releases/room
sqlite = "2.5.0-alpha05" # https://developer.android.com/jetpack/androidx/releases/sqlite
ksp = "2.0.20-Beta2-1.0.23"

detekt = "1.23.6" # https://github.com/detekt/detekt
detektCompose = "0.4.5" # https://github.com/mrmans0n/compose-rules
Expand Down Expand Up @@ -35,16 +37,22 @@ protobuf = "4.27.2"
[libraries]
kotlinGradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
androidGradle = { module = "com.android.tools.build:gradle", version.ref = "agp" }
realmGradle = { module = "io.realm.kotlin:gradle-plugin", version.ref = "realm" }
roomGradle = { module = "androidx.room:androidx.room.gradle.plugin", version.ref = "androidxRoom" }
detektGradle = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" }
composeKotlinGradle = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" }
protobufGradle = { module = "com.google.protobuf:protobuf-gradle-plugin", version = "0.9.4" }
secretsGradle = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1"
ksp = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" }


detektFormatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" }
detektCompose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" }

realmKotlin = { module = "io.realm.kotlin:library-base", version.ref = "realm" }
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "androidxRoom" }
room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "androidxRoom" }
sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" }


compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" }
compose-material3 = "androidx.compose.material3:material3:1.2.1" # https://developer.android.com/jetpack/androidx/releases/compose-material3
Expand Down
31 changes: 18 additions & 13 deletions repository/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree

plugins {
kotlin("multiplatform")
// kotlin("native.cocoapods")
id("com.android.library")
id("io.realm.kotlin")
id("androidx.room")
id("com.google.devtools.ksp")
}

version = "1.0"
Expand All @@ -22,21 +22,15 @@ kotlin {
iosArm64()
iosSimulatorArm64()

/*cocoapods {
summary = "Repository for Coffegram"
homepage = "https://github.com/phansier/Coffeegram"
ios.deploymentTarget = "14.1"
framework {
baseName = "repository"
}
// set path to your ios project podfile, e.g. podfile = project.file("../iosApp/Podfile")
}*/

sourceSets {
commonMain.dependencies {
implementation(libs.room.runtime)
implementation(libs.sqlite.bundled)
implementation(libs.sqlite)

implementation(libs.realmKotlin)
implementation(libs.coroutines.core)

implementation(libs.koin.core)
}
commonTest.dependencies {
implementation(kotlin("test-common"))
Expand All @@ -63,3 +57,14 @@ android {
sourceCompatibility = JavaVersion.VERSION_17
}
}

dependencies {
add("kspAndroid", libs.room.compiler)
add("kspIosSimulatorArm64", libs.room.compiler)
add("kspIosX64", libs.room.compiler)
add("kspIosArm64", libs.room.compiler)
}

room {
schemaDirectory("$projectDir/schemas")
}
49 changes: 49 additions & 0 deletions repository/schemas/repository.room.AppDatabase/1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "1c0cceb170206d2746a2cd0a0cc3af34",
"entities": [
{
"tableName": "DayCoffee",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `date` TEXT NOT NULL, `coffeeName` TEXT NOT NULL, `count` INTEGER NOT NULL)",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
{
"fieldPath": "date",
"columnName": "date",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "coffeeName",
"columnName": "coffeeName",
"affinity": "TEXT",
"notNull": true
},
{
"fieldPath": "count",
"columnName": "count",
"affinity": "INTEGER",
"notNull": true
}
],
"primaryKey": {
"autoGenerate": true,
"columnNames": [
"id"
]
}
}
],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1c0cceb170206d2746a2cd0a0cc3af34')"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package repository.room

import android.content.Context
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.driver.bundled.BundledSQLiteDriver
import kotlinx.coroutines.Dispatchers
import org.koin.dsl.module

actual fun roomModule() = module {
single<AppDatabase> { getDatabase(get()) }
}

fun getDatabaseBuilder(ctx: Context): RoomDatabase.Builder<AppDatabase> {
val appContext = ctx.applicationContext
val dbFile = appContext.getDatabasePath("my_room.db")
return Room.databaseBuilder<AppDatabase>(
context = appContext,
name = dbFile.absolutePath
)

.setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
}

fun getDatabase(ctx: Context): AppDatabase {
return getDatabaseBuilder(ctx).build()
}
12 changes: 0 additions & 12 deletions repository/src/androidUnitTest/kotlin/AndroidGreetingTest.kt

This file was deleted.

Loading

0 comments on commit 40549ad

Please sign in to comment.