From cd075e95601c6f41b960185d271ddae745058c9c Mon Sep 17 00:00:00 2001 From: denizk0461 Date: Tue, 30 May 2023 09:36:57 +0200 Subject: [PATCH] Added a database to migrate entry storage to later; added checks to determine whether existing entries need to be migrated from preference storage to database --- app/build.gradle | 6 +- app/src/main/AndroidManifest.xml | 1 - .../com/denizd/textbasic/db/AppDatabase.kt | 57 +++++++++++++++++++ .../java/com/denizd/textbasic/db/EntryDao.kt | 20 +++++++ .../com/denizd/textbasic/db/QuoteStorage.kt | 14 ++++- .../textbasic/fragment/QuoteFragment.kt | 9 +++ .../java/com/denizd/textbasic/model/Entry.kt | 14 +++++ .../java/com/denizd/textbasic/model/Quote.kt | 6 -- .../textbasic/util/SettingsPreference.kt | 5 +- 9 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/com/denizd/textbasic/db/AppDatabase.kt create mode 100644 app/src/main/java/com/denizd/textbasic/db/EntryDao.kt create mode 100644 app/src/main/java/com/denizd/textbasic/model/Entry.kt delete mode 100644 app/src/main/java/com/denizd/textbasic/model/Quote.kt diff --git a/app/build.gradle b/app/build.gradle index 2f42774..34d0a64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id "kotlin-kapt" } android { @@ -11,7 +12,7 @@ android { applicationId "com.denizk0461.textbasic" minSdk 23 targetSdk 33 - versionCode 10 + versionCode 11 versionName "2.0.2" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" @@ -56,4 +57,7 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' implementation "com.github.skydoves:colorpickerview:2.2.4" + + implementation "androidx.room:room-runtime:2.5.1" + kapt "androidx.room:room-compiler:2.5.1" } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 04b4897..8c67e8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,7 +19,6 @@ android:windowSoftInputMode="adjustPan"> - diff --git a/app/src/main/java/com/denizd/textbasic/db/AppDatabase.kt b/app/src/main/java/com/denizd/textbasic/db/AppDatabase.kt new file mode 100644 index 0000000..7ffd9ea --- /dev/null +++ b/app/src/main/java/com/denizd/textbasic/db/AppDatabase.kt @@ -0,0 +1,57 @@ +package com.denizd.textbasic.db + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase +import com.denizd.textbasic.model.Entry + +/** + * Room database that holds all objects that need to be saved to persistent storage. + */ +@Database( + entities = [ + Entry::class, + ], + version = 1, + exportSchema = true, +) +abstract class AppDatabase : RoomDatabase() { + + /** + * The database access object. Database transactions go through this. + */ + abstract fun dao(): EntryDao + + companion object { + // The singular instance of this database + private var instance: AppDatabase? = null + + /** + * Retrieve the instance of the database. + * + * @param context used to resolve the object + * @return the database + */ + fun getInstance(context: Context): AppDatabase { + /* + * Check if an object has already been instantiated. Only create a new instance if none + * exists. + */ + if (instance == null) { + synchronized(AppDatabase::class) { + instance = Room + .databaseBuilder( + context.applicationContext, + AppDatabase::class.java, + "text_basic_db", + ) +// .fallbackToDestructiveMigration() + .build() + } + } + // Instance can never be null at this point + return instance!! + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/db/EntryDao.kt b/app/src/main/java/com/denizd/textbasic/db/EntryDao.kt new file mode 100644 index 0000000..71361c7 --- /dev/null +++ b/app/src/main/java/com/denizd/textbasic/db/EntryDao.kt @@ -0,0 +1,20 @@ +package com.denizd.textbasic.db + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.denizd.textbasic.model.Entry + +@Dao +interface EntryDao { + + @Query("SELECT * FROM entries ORDER BY position") + fun getAllEntries(): LiveData> + + @Insert + fun insertEntries(newEntries: List) + + @Query("DELETE FROM entries") + fun deleteAllEntries() +} \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt b/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt index 41bf36c..b531ee8 100644 --- a/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt +++ b/app/src/main/java/com/denizd/textbasic/db/QuoteStorage.kt @@ -6,6 +6,8 @@ import com.denizd.textbasic.util.SettingsPreference class QuoteStorage private constructor(context: Context) { + private val dao: EntryDao = AppDatabase.getInstance(context).dao() + companion object { private lateinit var storage: QuoteStorage @@ -26,8 +28,6 @@ class QuoteStorage private constructor(context: Context) { private const val KEY_QUOTES = "quotes" private const val KEY_QUOTE_COUNTER = "quotecounter" const val KEY_TEXT_SIZE = "textsize" - private const val KEY_INVERTED = "inverted" - private const val KEY_HIGH_CONTRAST = "hicontrast" const val KEY_TEXT_TRANSPARENCY = "transparency_text" const val KEY_BG_TRANSPARENCY = "transparency" private const val KEY_RANDOM = "random" @@ -37,7 +37,6 @@ class QuoteStorage private constructor(context: Context) { private const val KEY_TYPEFACE_STYLE = "typefacestyle" private const val KEY_AVG_WIDTH = "avgwidth" private const val KEY_AVG_HEIGHT = "avgheight" - private const val KEY_OUTLINE_SIZE = "outlinesize" const val KEY_OUTLINE_SIZE_NEW = "outlinesizeint" } @@ -131,4 +130,13 @@ class QuoteStorage private constructor(context: Context) { .putString(KEY_QUOTES, quotes.joinToString(SEPARATOR.toString())) .apply() } + + fun needsMigration(): Boolean = prefs.getBoolean(SettingsPreference.NEEDS_MIGRATION.key, true) + fun migrateEntries() { + // TODO migrate entries + prefs.edit().putBoolean(SettingsPreference.NEEDS_MIGRATION.key, false).apply() + } + fun noMigrationNecessary() { + prefs.edit().putBoolean(SettingsPreference.NEEDS_MIGRATION.key, false).apply() + } } \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt b/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt index cad855b..d25fe00 100644 --- a/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt +++ b/app/src/main/java/com/denizd/textbasic/fragment/QuoteFragment.kt @@ -23,6 +23,15 @@ class QuoteFragment : BaseFragment(R.layout.fragment_quote), QuoteAdapter.OnDele super.onViewCreated(view, savedInstanceState) storage = QuoteStorage.getInstance(context) + + if (storage.getAllQuotes().isEmpty()) { + storage.noMigrationNecessary() + } + + if (storage.needsMigration()) { + storage.migrateEntries() + } + quoteAdapter = QuoteAdapter(storage.getAllQuotes(), this) binding.recyclerView.layoutManager = LinearLayoutManager(context) diff --git a/app/src/main/java/com/denizd/textbasic/model/Entry.kt b/app/src/main/java/com/denizd/textbasic/model/Entry.kt new file mode 100644 index 0000000..256d522 --- /dev/null +++ b/app/src/main/java/com/denizd/textbasic/model/Entry.kt @@ -0,0 +1,14 @@ +package com.denizd.textbasic.model + +import androidx.room.Entity +import androidx.room.PrimaryKey + +/** + * Stores a single entry. For use with a Room database. + */ +@Entity(tableName = "entries") +data class Entry( + @PrimaryKey val id: Int, + val text: String, + val position: Int, +) \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/model/Quote.kt b/app/src/main/java/com/denizd/textbasic/model/Quote.kt deleted file mode 100644 index 94ac186..0000000 --- a/app/src/main/java/com/denizd/textbasic/model/Quote.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.denizd.textbasic.model - -/** - * Stores a single quote. For potential use with a Room database. - */ -data class Quote(val id: Int, var text: String) \ No newline at end of file diff --git a/app/src/main/java/com/denizd/textbasic/util/SettingsPreference.kt b/app/src/main/java/com/denizd/textbasic/util/SettingsPreference.kt index 894b03c..4ba356e 100644 --- a/app/src/main/java/com/denizd/textbasic/util/SettingsPreference.kt +++ b/app/src/main/java/com/denizd/textbasic/util/SettingsPreference.kt @@ -4,10 +4,11 @@ import com.denizd.textbasic.db.QuoteStorage enum class SettingsPreference(val key: String) { TEXT_SIZE(QuoteStorage.KEY_TEXT_SIZE), - TEXT_TRANSPARENCY(QuoteStorage.KEY_TEXT_TRANSPARENCY), TEXT_COLOUR("textcolour"), HIGHLIGHT_INTENSITY(QuoteStorage.KEY_OUTLINE_SIZE_NEW), - HIGHLIGHT_TRANSPARENCY(QuoteStorage.KEY_BG_TRANSPARENCY), HIGHLIGHT_COLOUR("highlightcolour"), + + // Whether a migration from preference storage to Room is needed for the entries + NEEDS_MIGRATION("needs_migration"), ; } \ No newline at end of file