From 1268dce7bdb8ede354d85b40c4c3a1e0601fe48a Mon Sep 17 00:00:00 2001 From: Bnyro Date: Sat, 13 Aug 2022 20:04:07 +0200 Subject: [PATCH] initial database commit --- app/build.gradle | 2 ++ .../java/com/github/libretube/Constants.kt | 5 +++++ .../main/java/com/github/libretube/MyApp.kt | 18 ++++++++++----- .../github/libretube/database/AppDatabase.kt | 10 +++++++++ .../libretube/database/DatabaseHelper.kt | 21 ++++++++++++++++++ .../libretube/database/DatabaseHolder.kt | 17 ++++++++++++++ .../libretube/database/WatchHistoryDao.kt | 22 +++++++++++++++++++ .../libretube/fragments/PlayerFragment.kt | 4 ++-- .../fragments/WatchHistoryFragment.kt | 6 ++--- .../github/libretube/obj/WatchHistoryItem.kt | 21 +++++++++++------- gradle/libs.versions.toml | 4 +++- 11 files changed, 110 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/com/github/libretube/database/AppDatabase.kt create mode 100644 app/src/main/java/com/github/libretube/database/DatabaseHelper.kt create mode 100644 app/src/main/java/com/github/libretube/database/DatabaseHolder.kt create mode 100644 app/src/main/java/com/github/libretube/database/WatchHistoryDao.kt diff --git a/app/build.gradle b/app/build.gradle index f3948200e..c2270bbd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -106,6 +106,8 @@ dependencies { implementation libs.lifecycle.viewmodel implementation libs.lifecycle.runtime implementation libs.lifecycle.livedata + + implementation libs.room } static def getUnixTime() { diff --git a/app/src/main/java/com/github/libretube/Constants.kt b/app/src/main/java/com/github/libretube/Constants.kt index 7c5b6c075..fa4085808 100644 --- a/app/src/main/java/com/github/libretube/Constants.kt +++ b/app/src/main/java/com/github/libretube/Constants.kt @@ -49,3 +49,8 @@ const val DOWNLOAD_SUCCESS_NOTIFICATION_ID = 5 const val DOWNLOAD_CHANNEL_ID = "download_service" const val BACKGROUND_CHANNEL_ID = "background_mode" const val PUSH_CHANNEL_ID = "notification_worker" + +/** + * Database + */ +const val DATABASE_NAME = "LibreTubeDatabase" diff --git a/app/src/main/java/com/github/libretube/MyApp.kt b/app/src/main/java/com/github/libretube/MyApp.kt index 9c20a075d..c4cbf385e 100644 --- a/app/src/main/java/com/github/libretube/MyApp.kt +++ b/app/src/main/java/com/github/libretube/MyApp.kt @@ -8,6 +8,7 @@ import android.os.Build import android.os.StrictMode import android.os.StrictMode.VmPolicy import androidx.work.ExistingPeriodicWorkPolicy +import com.github.libretube.database.DatabaseHolder import com.github.libretube.preferences.PreferenceHelper import com.github.libretube.preferences.PreferenceKeys import com.github.libretube.util.ExceptionHandler @@ -19,15 +20,20 @@ class MyApp : Application() { super.onCreate() /** - * initialize the needed [NotificationChannel]s for DownloadService and BackgroundMode + * Initialize the needed [NotificationChannel]s for DownloadService and BackgroundMode */ initializeNotificationChannels() /** - * set the applicationContext as context for the [PreferenceHelper] + * Set the applicationContext as context for the [PreferenceHelper] */ PreferenceHelper.setContext(applicationContext) + /** + * Initialize the [DatabaseHolder] + */ + DatabaseHolder.initializeDatabase(this) + /** * bypassing fileUriExposedException, see https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed */ @@ -35,12 +41,12 @@ class MyApp : Application() { StrictMode.setVmPolicy(builder.build()) /** - * set the api and the auth api url + * Set the api and the auth api url */ setRetrofitApiUrls() /** - * initialize the notification listener in the background + * Initialize the notification listener in the background */ NotificationHelper.enqueueWork(this, ExistingPeriodicWorkPolicy.KEEP) @@ -52,13 +58,13 @@ class MyApp : Application() { Thread.setDefaultUncaughtExceptionHandler(exceptionHandler) /** - * legacy preference file migration + * Legacy preference file migration */ prefFileMigration() } /** - * set the api urls needed for the [RetrofitInstance] + * Set the api urls needed for the [RetrofitInstance] */ private fun setRetrofitApiUrls() { RetrofitInstance.url = diff --git a/app/src/main/java/com/github/libretube/database/AppDatabase.kt b/app/src/main/java/com/github/libretube/database/AppDatabase.kt new file mode 100644 index 000000000..e60631dd5 --- /dev/null +++ b/app/src/main/java/com/github/libretube/database/AppDatabase.kt @@ -0,0 +1,10 @@ +package com.github.libretube.database + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.github.libretube.obj.WatchHistoryItem + +@Database(entities = [WatchHistoryItem::class], version = 1) +abstract class AppDatabase : RoomDatabase() { + abstract fun watchHistoryDao(): WatchHistoryDao +} diff --git a/app/src/main/java/com/github/libretube/database/DatabaseHelper.kt b/app/src/main/java/com/github/libretube/database/DatabaseHelper.kt new file mode 100644 index 000000000..92031a2e0 --- /dev/null +++ b/app/src/main/java/com/github/libretube/database/DatabaseHelper.kt @@ -0,0 +1,21 @@ +package com.github.libretube.database + +import com.github.libretube.obj.Streams +import com.github.libretube.obj.WatchHistoryItem +import com.github.libretube.util.toID + +object DatabaseHelper { + fun addToWatchHistory(videoId: String, streams: Streams) { + val watchHistoryItem = WatchHistoryItem( + videoId, + streams.title, + streams.uploadDate, + streams.uploader, + streams.uploaderUrl.toID(), + streams.uploaderAvatar, + streams.thumbnailUrl, + streams.duration + ) + DatabaseHolder.database.watchHistoryDao().insertAll(watchHistoryItem) + } +} diff --git a/app/src/main/java/com/github/libretube/database/DatabaseHolder.kt b/app/src/main/java/com/github/libretube/database/DatabaseHolder.kt new file mode 100644 index 000000000..09ce329a8 --- /dev/null +++ b/app/src/main/java/com/github/libretube/database/DatabaseHolder.kt @@ -0,0 +1,17 @@ +package com.github.libretube.database + +import android.content.Context +import androidx.room.Room +import com.github.libretube.DATABASE_NAME + +object DatabaseHolder { + lateinit var database: AppDatabase + + fun initializeDatabase(context: Context) { + database = Room.databaseBuilder( + context, + AppDatabase::class.java, + DATABASE_NAME + ).build() + } +} diff --git a/app/src/main/java/com/github/libretube/database/WatchHistoryDao.kt b/app/src/main/java/com/github/libretube/database/WatchHistoryDao.kt new file mode 100644 index 000000000..23957f518 --- /dev/null +++ b/app/src/main/java/com/github/libretube/database/WatchHistoryDao.kt @@ -0,0 +1,22 @@ +package com.github.libretube.database + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import com.github.libretube.obj.WatchHistoryItem + +@Dao +interface WatchHistoryDao { + @Query("SELECT * FROM watchHistoryItem") + fun getAll(): List + + @Query("SELECT * FROM watchHistoryItem WHERE videoId LIKE :videoId LIMIT 1") + fun findById(videoId: String): WatchHistoryItem + + @Insert + fun insertAll(vararg watchHistoryItems: WatchHistoryItem) + + @Delete + fun delete(watchHistoryItem: WatchHistoryItem) +} diff --git a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt index 200cdf81f..34af17ea6 100644 --- a/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/PlayerFragment.kt @@ -37,6 +37,7 @@ import com.github.libretube.activities.MainActivity import com.github.libretube.adapters.ChaptersAdapter import com.github.libretube.adapters.CommentsAdapter import com.github.libretube.adapters.TrendingAdapter +import com.github.libretube.database.DatabaseHelper import com.github.libretube.databinding.DoubleTapOverlayBinding import com.github.libretube.databinding.ExoStyledPlayerControlViewBinding import com.github.libretube.databinding.FragmentPlayerBinding @@ -88,7 +89,6 @@ import com.google.android.exoplayer2.upstream.DefaultHttpDataSource import com.google.android.exoplayer2.util.RepeatModeUtil import com.google.android.exoplayer2.video.VideoSize import com.google.android.material.dialog.MaterialAlertDialogBuilder -import kotlinx.android.synthetic.main.bottom_sheet.repeatMode import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -878,7 +878,7 @@ class PlayerFragment : BaseFragment() { if (!relatedStreamsEnabled) toggleComments() // prepare for autoplay if (autoplayEnabled) setNextStream() - if (watchHistoryEnabled) PreferenceHelper.addToWatchHistory(videoId!!, streams) + if (watchHistoryEnabled) DatabaseHelper.addToWatchHistory(videoId!!, streams) } } } diff --git a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt index 2aa4ad123..ad3c45a13 100644 --- a/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt +++ b/app/src/main/java/com/github/libretube/fragments/WatchHistoryFragment.kt @@ -8,9 +8,9 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.github.libretube.adapters.WatchHistoryAdapter +import com.github.libretube.database.DatabaseHolder import com.github.libretube.databinding.FragmentWatchHistoryBinding import com.github.libretube.extensions.BaseFragment -import com.github.libretube.preferences.PreferenceHelper class WatchHistoryFragment : BaseFragment() { private val TAG = "WatchHistoryFragment" @@ -28,7 +28,7 @@ class WatchHistoryFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val watchHistory = PreferenceHelper.getWatchHistory() + val watchHistory = DatabaseHolder.database.watchHistoryDao().getAll() if (watchHistory.isEmpty()) return @@ -39,7 +39,7 @@ class WatchHistoryFragment : BaseFragment() { } val watchHistoryAdapter = WatchHistoryAdapter( - watchHistory, + watchHistory.toMutableList(), childFragmentManager ) diff --git a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt index f8b436d5f..e4cffc9e4 100644 --- a/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt +++ b/app/src/main/java/com/github/libretube/obj/WatchHistoryItem.kt @@ -1,12 +1,17 @@ package com.github.libretube.obj +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "watchHistoryItem") data class WatchHistoryItem( - val videoId: String? = null, - val title: String? = null, - val uploadDate: String? = null, - val uploader: String? = null, - val uploaderUrl: String? = null, - val uploaderAvatar: String? = null, - val thumbnailUrl: String? = null, - val duration: Long? = null + @PrimaryKey val videoId: String? = null, + @ColumnInfo val title: String? = null, + @ColumnInfo val uploadDate: String? = null, + @ColumnInfo val uploader: String? = null, + @ColumnInfo val uploaderUrl: String? = null, + @ColumnInfo val uploaderAvatar: String? = null, + @ColumnInfo val thumbnailUrl: String? = null, + @ColumnInfo val duration: Long? = null ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9fac8f143..fd8f7b7ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -20,6 +20,7 @@ cronetEmbedded = "101.4951.41" cronetOkHttp = "0.1.0" coil = "2.1.0" leakcanary = "2.8.1" +room = "2.4.3" [libraries] androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } @@ -48,4 +49,5 @@ coil = { group = "io.coil-kt", name = "coil", version.ref="coil" } square-leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakcanary" } lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" } lifecycle-runtime = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycle" } -lifecycle-livedata = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" } \ No newline at end of file +lifecycle-livedata = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" } +room = { group = "androidx.room", name="room-runtime", version.ref = "room" } \ No newline at end of file