diff --git a/app/src/main/java/com/github/libretube/LibreTubeApp.kt b/app/src/main/java/com/github/libretube/LibreTubeApp.kt index 9c75cae9b..95450a82c 100644 --- a/app/src/main/java/com/github/libretube/LibreTubeApp.kt +++ b/app/src/main/java/com/github/libretube/LibreTubeApp.kt @@ -3,6 +3,7 @@ package com.github.libretube import android.app.Application import android.os.StrictMode import android.os.StrictMode.VmPolicy +import android.util.Log import androidx.core.app.NotificationChannelCompat import androidx.core.app.NotificationManagerCompat import androidx.work.ExistingPeriodicWorkPolicy @@ -12,6 +13,10 @@ import com.github.libretube.constants.BACKGROUND_CHANNEL_ID import com.github.libretube.constants.DOWNLOAD_CHANNEL_ID import com.github.libretube.constants.PUSH_CHANNEL_ID import com.github.libretube.db.DatabaseHolder +import com.github.libretube.db.obj.LocalPlaylist +import com.github.libretube.db.obj.LocalPlaylistItem +import com.github.libretube.extensions.awaitQuery +import com.github.libretube.extensions.query import com.github.libretube.util.ExceptionHandler import com.github.libretube.util.ImageHelper import com.github.libretube.util.NotificationHelper @@ -36,6 +41,8 @@ class LibreTubeApp : Application() { */ DatabaseHolder().initializeDatabase(this) + runDatabaseTests() + /** * Bypassing fileUriExposedException, see https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed */ @@ -100,4 +107,23 @@ class LibreTubeApp : Application() { ) ) } + + private fun runDatabaseTests() { + awaitQuery { + val playlist = LocalPlaylist( + name = "TEstlist", + thumbnailUrl = "thumb" + ) + DatabaseHolder.Database.localPlaylistsDao().createPlaylist(playlist) + val playlistId = DatabaseHolder.Database.localPlaylistsDao().getAll().first().playlist.id + val video = LocalPlaylistItem( + videoId = "video", + playlistId = playlistId, + title = "awesomePlaylistTitle" + ) + DatabaseHolder.Database.localPlaylistsDao().addPlaylistVideo(video) + val lists = DatabaseHolder.Database.localPlaylistsDao().getAll() + Log.e("lists", lists.toString()) + } + } } diff --git a/app/src/main/java/com/github/libretube/db/AppDatabase.kt b/app/src/main/java/com/github/libretube/db/AppDatabase.kt index f856c9904..8bb3f36d3 100644 --- a/app/src/main/java/com/github/libretube/db/AppDatabase.kt +++ b/app/src/main/java/com/github/libretube/db/AppDatabase.kt @@ -5,12 +5,15 @@ import androidx.room.Database import androidx.room.RoomDatabase import com.github.libretube.db.dao.CustomInstanceDao import com.github.libretube.db.dao.LocalSubscriptionDao +import com.github.libretube.db.dao.LocalPlaylistsDao import com.github.libretube.db.dao.PlaylistBookmarkDao import com.github.libretube.db.dao.SearchHistoryDao import com.github.libretube.db.dao.WatchHistoryDao import com.github.libretube.db.dao.WatchPositionDao import com.github.libretube.db.obj.CustomInstance import com.github.libretube.db.obj.LocalSubscription +import com.github.libretube.db.obj.LocalPlaylist +import com.github.libretube.db.obj.LocalPlaylistItem import com.github.libretube.db.obj.PlaylistBookmark import com.github.libretube.db.obj.SearchHistoryItem import com.github.libretube.db.obj.WatchHistoryItem @@ -23,11 +26,14 @@ import com.github.libretube.db.obj.WatchPosition SearchHistoryItem::class, CustomInstance::class, LocalSubscription::class, - PlaylistBookmark::class + PlaylistBookmark::class, + LocalPlaylist::class, + LocalPlaylistItem::class ], - version = 8, + version = 9, autoMigrations = [ - AutoMigration(from = 7, to = 8) + AutoMigration(from = 7, to = 8), + AutoMigration(from = 8, to = 9) ] ) abstract class AppDatabase : RoomDatabase() { @@ -60,4 +66,9 @@ abstract class AppDatabase : RoomDatabase() { * Bookmarked Playlists */ abstract fun playlistBookmarkDao(): PlaylistBookmarkDao + + /** + * Local playlists + */ + abstract fun localPlaylistsDao(): LocalPlaylistsDao } diff --git a/app/src/main/java/com/github/libretube/db/dao/LocalPlaylistsDao.kt b/app/src/main/java/com/github/libretube/db/dao/LocalPlaylistsDao.kt new file mode 100644 index 000000000..ca3a986a9 --- /dev/null +++ b/app/src/main/java/com/github/libretube/db/dao/LocalPlaylistsDao.kt @@ -0,0 +1,33 @@ +package com.github.libretube.db.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Transaction +import androidx.room.Update +import com.github.libretube.db.obj.LocalPlaylist +import com.github.libretube.db.obj.LocalPlaylistItem +import com.github.libretube.db.obj.LocalPlaylistWithVideos + +@Dao +interface LocalPlaylistsDao { + @Transaction + @Query("SELECT * FROM LocalPlaylist") + fun getAll(): List + + @Insert + fun createPlaylist(playlist: LocalPlaylist) + + @Update + fun updatePlaylist(playlist: LocalPlaylist) + + @Delete + fun deletePlaylist(playlist: LocalPlaylist) + + @Insert + fun addPlaylistVideo(playlistVideo: LocalPlaylistItem) + + @Delete + fun removePlaylistVideo(playlistVideo: LocalPlaylistItem) +} diff --git a/app/src/main/java/com/github/libretube/db/obj/LocalPlaylist.kt b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylist.kt new file mode 100644 index 000000000..a60fb6ff1 --- /dev/null +++ b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylist.kt @@ -0,0 +1,12 @@ +package com.github.libretube.db.obj + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class LocalPlaylist( + @PrimaryKey(autoGenerate = true) + val id: Int = 0, + val name: String, + val thumbnailUrl: String +) diff --git a/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistItem.kt b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistItem.kt new file mode 100644 index 000000000..ad3be4f2c --- /dev/null +++ b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistItem.kt @@ -0,0 +1,19 @@ +package com.github.libretube.db.obj + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity +data class LocalPlaylistItem( + @PrimaryKey(autoGenerate = true) val id: Int = 0, + @ColumnInfo val playlistId: Int, + @ColumnInfo val videoId: String, + @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/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistWithVideos.kt b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistWithVideos.kt new file mode 100644 index 000000000..a4cca23cd --- /dev/null +++ b/app/src/main/java/com/github/libretube/db/obj/LocalPlaylistWithVideos.kt @@ -0,0 +1,13 @@ +package com.github.libretube.db.obj + +import androidx.room.Embedded +import androidx.room.Relation + +data class LocalPlaylistWithVideos( + @Embedded val playlist: LocalPlaylist, + @Relation( + parentColumn = "id", + entityColumn = "playlistId" + ) + val videos: List +)