diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 56aa008e..c8275882 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -12,7 +12,6 @@
-
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index a5f05cd8..23704740 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -21,5 +21,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 98cdc236..f010ff24 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -3,6 +3,10 @@ plugins {
id "dagger.hilt.android.plugin"
}
+repositories {
+ maven { url 'https://jitpack.io' }
+}
+
final def keystorePropertiesFile = rootProject.file("keystore.properties")
android {
adbOptions {
@@ -11,6 +15,11 @@ android {
defaultConfig {
applicationId "dev.msfjarvis.lobsters"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ javaCompileOptions {
+ annotationProcessorOptions {
+ arguments += ["room.schemaLocation": "$projectDir/schemas".toString()]
+ }
+ }
}
buildTypes {
@@ -60,9 +69,10 @@ tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
dependencies {
+ kapt "com.github.MatrixDev.Roomigrant:RoomigrantCompiler:$roomigrant_version"
kapt "com.google.dagger:hilt-compiler:$hilt_dagger_version"
kapt "androidx.hilt:hilt-compiler:$hilt_androidx_version"
- implementation(project(":data"))
+ kapt "androidx.room:room-compiler:$room_version"
implementation(project(":lobsters-api"))
implementation(project(":model"))
implementation "androidx.core:core-ktx:$core_version"
@@ -83,9 +93,13 @@ dependencies {
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
implementation "androidx.navigation:navigation-compose:$nav_compose_version"
+ implementation "androidx.room:room-runtime:$room_version"
+ implementation "androidx.room:room-ktx:$room_version"
implementation "androidx.ui:ui-tooling:$compose_version"
+ implementation "com.github.MatrixDev.Roomigrant:RoomigrantLib:$roomigrant_version"
implementation "com.google.android.material:material:$material_version"
implementation "com.google.dagger:hilt-android:$hilt_dagger_version"
+ implementation "com.squareup.moshi:moshi:$moshi_version"
implementation "dev.chrisbanes.accompanist:accompanist-coil:$accompanist_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
implementation "saschpe.android:customtabs:$customtabs_version"
diff --git a/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/2.json b/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/2.json
new file mode 100644
index 00000000..977d35a6
--- /dev/null
+++ b/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/2.json
@@ -0,0 +1,198 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 2,
+ "identityHash": "5146546ebef999689c82a1b89e667eb4",
+ "entities": [
+ {
+ "tableName": "lobsters_posts",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`shortId` TEXT NOT NULL, `shortIdUrl` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `title` TEXT NOT NULL, `url` TEXT NOT NULL, `score` INTEGER NOT NULL, `flags` INTEGER NOT NULL, `commentCount` INTEGER NOT NULL, `description` TEXT NOT NULL, `commentsUrl` TEXT NOT NULL, `submitterUser` TEXT NOT NULL, `tags` TEXT NOT NULL, `isLiked` INTEGER NOT NULL, PRIMARY KEY(`shortId`))",
+ "fields": [
+ {
+ "fieldPath": "post.shortId",
+ "columnName": "shortId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.shortIdUrl",
+ "columnName": "shortIdUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.createdAt",
+ "columnName": "createdAt",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.score",
+ "columnName": "score",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.flags",
+ "columnName": "flags",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentCount",
+ "columnName": "commentCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentsUrl",
+ "columnName": "commentsUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.submitterUser",
+ "columnName": "submitterUser",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.tags",
+ "columnName": "tags",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.isLiked",
+ "columnName": "isLiked",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "shortId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "lobsters_saved_posts",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`shortId` TEXT NOT NULL, `shortIdUrl` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `title` TEXT NOT NULL, `url` TEXT NOT NULL, `score` INTEGER NOT NULL, `flags` INTEGER NOT NULL, `commentCount` INTEGER NOT NULL, `description` TEXT NOT NULL, `commentsUrl` TEXT NOT NULL, `submitterUser` TEXT NOT NULL, `tags` TEXT NOT NULL, `isLiked` INTEGER NOT NULL, PRIMARY KEY(`shortId`))",
+ "fields": [
+ {
+ "fieldPath": "post.shortId",
+ "columnName": "shortId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.shortIdUrl",
+ "columnName": "shortIdUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.createdAt",
+ "columnName": "createdAt",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.score",
+ "columnName": "score",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.flags",
+ "columnName": "flags",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentCount",
+ "columnName": "commentCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentsUrl",
+ "columnName": "commentsUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.submitterUser",
+ "columnName": "submitterUser",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.tags",
+ "columnName": "tags",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.isLiked",
+ "columnName": "isLiked",
+ "affinity": "INTEGER",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "shortId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "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, '5146546ebef999689c82a1b89e667eb4')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/3.json b/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/3.json
new file mode 100644
index 00000000..1b79a63f
--- /dev/null
+++ b/app/schemas/dev.msfjarvis.lobsters.data.source.PostsDatabase/3.json
@@ -0,0 +1,186 @@
+{
+ "formatVersion": 1,
+ "database": {
+ "version": 3,
+ "identityHash": "fb910a30af3f2c97fcd1f530c798e6e5",
+ "entities": [
+ {
+ "tableName": "lobsters_posts",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`shortId` TEXT NOT NULL, `shortIdUrl` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `title` TEXT NOT NULL, `url` TEXT NOT NULL, `score` INTEGER NOT NULL, `flags` INTEGER NOT NULL, `commentCount` INTEGER NOT NULL, `description` TEXT NOT NULL, `commentsUrl` TEXT NOT NULL, `submitterUser` TEXT NOT NULL, `tags` TEXT NOT NULL, PRIMARY KEY(`shortId`))",
+ "fields": [
+ {
+ "fieldPath": "post.shortId",
+ "columnName": "shortId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.shortIdUrl",
+ "columnName": "shortIdUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.createdAt",
+ "columnName": "createdAt",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.score",
+ "columnName": "score",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.flags",
+ "columnName": "flags",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentCount",
+ "columnName": "commentCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentsUrl",
+ "columnName": "commentsUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.submitterUser",
+ "columnName": "submitterUser",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.tags",
+ "columnName": "tags",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "shortId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ },
+ {
+ "tableName": "lobsters_saved_posts",
+ "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`shortId` TEXT NOT NULL, `shortIdUrl` TEXT NOT NULL, `createdAt` TEXT NOT NULL, `title` TEXT NOT NULL, `url` TEXT NOT NULL, `score` INTEGER NOT NULL, `flags` INTEGER NOT NULL, `commentCount` INTEGER NOT NULL, `description` TEXT NOT NULL, `commentsUrl` TEXT NOT NULL, `submitterUser` TEXT NOT NULL, `tags` TEXT NOT NULL, PRIMARY KEY(`shortId`))",
+ "fields": [
+ {
+ "fieldPath": "post.shortId",
+ "columnName": "shortId",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.shortIdUrl",
+ "columnName": "shortIdUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.createdAt",
+ "columnName": "createdAt",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.title",
+ "columnName": "title",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.url",
+ "columnName": "url",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.score",
+ "columnName": "score",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.flags",
+ "columnName": "flags",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentCount",
+ "columnName": "commentCount",
+ "affinity": "INTEGER",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.description",
+ "columnName": "description",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.commentsUrl",
+ "columnName": "commentsUrl",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.submitterUser",
+ "columnName": "submitterUser",
+ "affinity": "TEXT",
+ "notNull": true
+ },
+ {
+ "fieldPath": "post.tags",
+ "columnName": "tags",
+ "affinity": "TEXT",
+ "notNull": true
+ }
+ ],
+ "primaryKey": {
+ "columnNames": [
+ "shortId"
+ ],
+ "autoGenerate": false
+ },
+ "indices": [],
+ "foreignKeys": []
+ }
+ ],
+ "views": [],
+ "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, 'fb910a30af3f2c97fcd1f530c798e6e5')"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/model/LobstersEntity.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/model/LobstersEntity.kt
similarity index 100%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/model/LobstersEntity.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/model/LobstersEntity.kt
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/model/SavedLobstersEntity.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/model/SavedLobstersEntity.kt
similarity index 100%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/model/SavedLobstersEntity.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/model/SavedLobstersEntity.kt
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt
similarity index 100%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/source/LobstersApiTypeConverters.kt
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt
similarity index 100%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDao.kt
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt
similarity index 82%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt
index d1e8a36e..6a5f48e4 100644
--- a/data/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt
+++ b/app/src/main/java/dev/msfjarvis/lobsters/data/source/PostsDatabase.kt
@@ -3,6 +3,7 @@ package dev.msfjarvis.lobsters.data.source
import androidx.room.Database
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
+import dev.matrix.roomigrant.GenerateRoomMigrations
import dev.msfjarvis.lobsters.data.model.LobstersEntity
import dev.msfjarvis.lobsters.data.model.SavedLobstersEntity
@@ -11,12 +12,13 @@ import dev.msfjarvis.lobsters.data.model.SavedLobstersEntity
LobstersEntity::class,
SavedLobstersEntity::class
],
- version = 2,
- exportSchema = false,
+ version = 3,
+ exportSchema = true,
)
@TypeConverters(
LobstersApiTypeConverters::class,
)
+@GenerateRoomMigrations
abstract class PostsDatabase : RoomDatabase() {
abstract fun postsDao(): PostsDao
abstract fun savedPostsDao(): SavedPostsDao
diff --git a/data/src/main/java/dev/msfjarvis/lobsters/data/source/SavedPostsDao.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/source/SavedPostsDao.kt
similarity index 100%
rename from data/src/main/java/dev/msfjarvis/lobsters/data/source/SavedPostsDao.kt
rename to app/src/main/java/dev/msfjarvis/lobsters/data/source/SavedPostsDao.kt
diff --git a/app/src/main/java/dev/msfjarvis/lobsters/injection/PersistenceModule.kt b/app/src/main/java/dev/msfjarvis/lobsters/injection/PersistenceModule.kt
index 622ebdff..b13e523e 100644
--- a/app/src/main/java/dev/msfjarvis/lobsters/injection/PersistenceModule.kt
+++ b/app/src/main/java/dev/msfjarvis/lobsters/injection/PersistenceModule.kt
@@ -8,6 +8,7 @@ import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ApplicationContext
import dev.msfjarvis.lobsters.data.source.PostsDatabase
+import dev.msfjarvis.lobsters.data.source.PostsDatabase_Migrations
@Module
@InstallIn(ActivityComponent::class)
@@ -16,7 +17,7 @@ object PersistenceModule {
@Provides
fun providePostsDatabase(@ApplicationContext context: Context): PostsDatabase {
return Room.databaseBuilder(context, PostsDatabase::class.java, "posts.db")
- .fallbackToDestructiveMigration()
+ .addMigrations(*PostsDatabase_Migrations.build())
.build()
}
}
diff --git a/build.gradle b/build.gradle
index b17c18e6..cae12b01 100644
--- a/build.gradle
+++ b/build.gradle
@@ -23,6 +23,7 @@ buildscript {
okhttp_version = "4.10.0-RC1"
retrofit_version = "2.9.0"
room_version = "2.3.0-alpha03"
+ roomigrant_version = "0.2.0"
}
repositories {
google()
diff --git a/data/.gitignore b/data/.gitignore
deleted file mode 100644
index 42afabfd..00000000
--- a/data/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
\ No newline at end of file
diff --git a/data/build.gradle b/data/build.gradle
deleted file mode 100644
index 81698f83..00000000
--- a/data/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-plugins {
- id 'kotlin-kapt'
-}
-
-dependencies {
- implementation project(":model")
- kapt "androidx.room:room-compiler:$room_version"
- api "androidx.room:room-runtime:$room_version"
- implementation "androidx.room:room-ktx:$room_version"
- implementation "com.squareup.moshi:moshi:$moshi_version"
- implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
-}
diff --git a/data/src/main/AndroidManifest.xml b/data/src/main/AndroidManifest.xml
deleted file mode 100644
index 2357d0f8..00000000
--- a/data/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt b/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt
index c379b440..f6d947bd 100644
--- a/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt
+++ b/model/src/main/java/dev/msfjarvis/lobsters/model/LobstersPost.kt
@@ -23,6 +23,4 @@ class LobstersPost(
@Json(name = "submitter_user")
val submitterUser: Submitter,
val tags: List,
- @Deprecated("Retained for database compatibility as I am too lazy to write migrations")
- val isLiked: Boolean = false,
)
diff --git a/settings.gradle b/settings.gradle
index f1785d43..06174a37 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,5 +1,4 @@
rootProject.name = "lobste.rs"
include ':app'
-include ':data'
include ':lobsters-api'
include ':model'