From 1921be695c9c11cd9cb87a1b00823dcef0faab47 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Mon, 7 Jun 2021 22:52:31 +0200 Subject: [PATCH] Add server database --- app/build.gradle | 3 +- .../dev/jdtech/jellyfin/database/Server.kt | 12 ++++-- .../jellyfin/database/ServerDatabase.kt | 32 +++++++++++++++ .../jellyfin/database/ServerDatabaseDao.kt | 28 +++++++++++++ .../serverselect/ServerSelectFragment.kt | 8 +++- .../serverselect/ServerSelectViewModel.kt | 40 +++++++++++++++---- .../ServerSelectViewModelFactory.kt | 17 ++++++++ 7 files changed, 128 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt create mode 100644 app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt diff --git a/app/build.gradle b/app/build.gradle index 8e2b9fd2..f5b9f3b2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,8 @@ dependencies { implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' implementation "androidx.room:room-runtime:$room_version" - annotationProcessor "androidx.room:room-compiler:$room_version" + kapt "androidx.room:room-compiler:$room_version" + implementation "androidx.room:room-ktx:$room_version" testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2' diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/Server.kt b/app/src/main/java/dev/jdtech/jellyfin/database/Server.kt index 54f44263..268c44cc 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/database/Server.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/database/Server.kt @@ -1,9 +1,15 @@ package dev.jdtech.jellyfin.database -import java.util.* +import androidx.room.Entity +import androidx.room.PrimaryKey +@Entity(tableName = "servers") data class Server( - val id: UUID, + @PrimaryKey + val id: String, val name: String, - val address: String + val address: String, + val userId: String, + val userName: String, + val accessToken: String, ) \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt b/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt new file mode 100644 index 00000000..4f111994 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabase.kt @@ -0,0 +1,32 @@ +package dev.jdtech.jellyfin.database + +import android.content.Context +import androidx.room.Database +import androidx.room.Room +import androidx.room.RoomDatabase + +@Database(entities = [Server::class], version = 1, exportSchema = false) +abstract class ServerDatabase : RoomDatabase() { + abstract val serverDatabaseDao: ServerDatabaseDao + + companion object { + @Volatile + private var INSTANCE: ServerDatabase? = null + + fun getInstance(context: Context): ServerDatabase { + synchronized(this) { + var instance = INSTANCE + if (instance == null) { + instance = Room.databaseBuilder( + context.applicationContext, + ServerDatabase::class.java, + "servers" + ) + .fallbackToDestructiveMigration().build() + INSTANCE = instance + } + return instance + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt b/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt new file mode 100644 index 00000000..5f2a2119 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/database/ServerDatabaseDao.kt @@ -0,0 +1,28 @@ +package dev.jdtech.jellyfin.database + +import androidx.lifecycle.LiveData +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import androidx.room.Update + +@Dao +interface ServerDatabaseDao { + @Insert + fun insert(server: Server) + + @Update + fun update(server: Server) + + @Query("select * from servers where id = :id") + fun get(id: String): Server + + @Query("delete from servers") + fun clear() + + @Query("select * from servers") + fun getAllServers(): LiveData> + + @Query("delete from servers where id = :id") + fun delete(id: String) +} \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt index cb11fe75..7816b8df 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import dev.jdtech.jellyfin.R +import dev.jdtech.jellyfin.database.ServerDatabase import dev.jdtech.jellyfin.databinding.FragmentServerSelectBinding @@ -18,7 +19,12 @@ class ServerSelectFragment : Fragment() { ): View? { val binding = FragmentServerSelectBinding.inflate(inflater) - val viewModel = ViewModelProvider(this).get(ServerSelectViewModel::class.java) + val application = requireNotNull(this.activity).application + + val dataSource = ServerDatabase.getInstance(application).serverDatabaseDao + + val viewModelFactory = ServerSelectViewModelFactory(dataSource) + val viewModel = ViewModelProvider(this, viewModelFactory).get(ServerSelectViewModel::class.java) binding.lifecycleOwner = this binding.viewModel = viewModel diff --git a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt index 51f1b8f2..8fd8f1fd 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt @@ -1,19 +1,45 @@ package dev.jdtech.jellyfin.serverselect import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import dev.jdtech.jellyfin.database.Server -import java.util.* +import dev.jdtech.jellyfin.database.ServerDatabaseDao +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext -class ServerSelectViewModel : ViewModel() { - private val _servers = MutableLiveData>() +class ServerSelectViewModel( + val database: ServerDatabaseDao, +) : ViewModel() { + private val _servers = database.getAllServers() val servers: LiveData> get() = _servers init { - val server = Server(UUID.randomUUID(), "JDTech", "https://jellyfin.jdtech.dev") - val demoServer = Server(UUID.randomUUID(), "Demo", "https://demo.jellyfin.org") - _servers.value = listOf(server, demoServer) + val demoServer = Server("0", "Demo", "https://demo.jellyfin.org", "0", "demo", "") + + viewModelScope.launch { + clearDatabase() + insert(demoServer) + } + } + + private suspend fun insert(server: Server) { + withContext(Dispatchers.IO) { + database.insert(server) + } + } + + private suspend fun delete(server: Server) { + withContext(Dispatchers.IO) { + database.delete(server.id) + } + } + + private suspend fun clearDatabase() { + withContext(Dispatchers.IO) { + database.clear() + } } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt new file mode 100644 index 00000000..c18c6b7d --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt @@ -0,0 +1,17 @@ +package dev.jdtech.jellyfin.serverselect + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import dev.jdtech.jellyfin.database.ServerDatabaseDao +import java.lang.IllegalArgumentException + +class ServerSelectViewModelFactory( + private val dataSource: ServerDatabaseDao + ) : ViewModelProvider.Factory { + override fun create(modelClass: Class): T { + if (modelClass.isAssignableFrom(ServerSelectViewModel::class.java)) { + return ServerSelectViewModel(dataSource) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file