From b3b19cef0497652cb822662695d5b8a5fc466260 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Wed, 9 Jun 2021 21:28:25 +0200 Subject: [PATCH] Add Jellyfin Kotlin SDK --- app/build.gradle | 6 +++ .../dev/jdtech/jellyfin/api/JellyfinApi.kt | 47 +++++++++++++++++++ .../serverselect/ServerSelectFragment.kt | 2 +- .../serverselect/ServerSelectViewModel.kt | 2 + .../ServerSelectViewModelFactory.kt | 6 ++- 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt diff --git a/app/build.gradle b/app/build.gradle index f5b9f3b2..9f2c42e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -39,6 +39,7 @@ android { dependencies { def room_version = "2.3.0" + def jellyfin_version = "1.0.0-beta.7" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" implementation 'androidx.core:core-ktx:1.5.0' @@ -49,10 +50,15 @@ dependencies { implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + // Room implementation "androidx.room:room-runtime:$room_version" kapt "androidx.room:room-compiler:$room_version" implementation "androidx.room:room-ktx:$room_version" + // Jellyfin + implementation "org.jellyfin.sdk:jellyfin-platform-android:$jellyfin_version" + + // Testing testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt new file mode 100644 index 00000000..055d72ed --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/api/JellyfinApi.kt @@ -0,0 +1,47 @@ +package dev.jdtech.jellyfin.api + +import android.content.Context +import android.util.Log +import dev.jdtech.jellyfin.BuildConfig +import org.jellyfin.sdk.Jellyfin +import org.jellyfin.sdk.android +import org.jellyfin.sdk.api.operations.SystemApi +import org.jellyfin.sdk.model.ClientInfo + +class JellyfinApi(context: Context, baseUrl: String) { + val jellyfin = Jellyfin { + clientInfo = + ClientInfo(name = BuildConfig.APPLICATION_ID, version = BuildConfig.VERSION_NAME) + android(context) + } + val api = jellyfin.createApi(baseUrl = baseUrl) + val systemApi = SystemApi(api) + + init { + Log.i("JellyfinApi", "Constructor called!") + } + + companion object { + @Volatile + private var INSTANCE: JellyfinApi? = null + + fun getInstance(context: Context, baseUrl: String): JellyfinApi { + synchronized(this) { + var instance = INSTANCE + if (instance == null) { + instance = JellyfinApi(context.applicationContext, baseUrl) + INSTANCE = instance + } + return instance + } + } + + fun newInstance(context: Context, baseUrl: String): JellyfinApi { + synchronized(this) { + val instance = JellyfinApi(context.applicationContext, baseUrl) + INSTANCE = instance + return instance + } + } + } +} \ 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 da75f361..9a98f9eb 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectFragment.kt @@ -25,7 +25,7 @@ class ServerSelectFragment : Fragment() { val dataSource = ServerDatabase.getInstance(application).serverDatabaseDao - val viewModelFactory = ServerSelectViewModelFactory(dataSource) + val viewModelFactory = ServerSelectViewModelFactory(dataSource, application) val viewModel = ViewModelProvider(this, viewModelFactory).get(ServerSelectViewModel::class.java) binding.lifecycleOwner = this 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 55345e71..9815f9e2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModel.kt @@ -1,5 +1,6 @@ package dev.jdtech.jellyfin.serverselect +import android.app.Application import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -12,6 +13,7 @@ import java.util.* class ServerSelectViewModel( val database: ServerDatabaseDao, + val application: Application, ) : ViewModel() { private val _servers = database.getAllServers() val servers: LiveData> diff --git a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt index 771b08d3..742f69eb 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/serverselect/ServerSelectViewModelFactory.kt @@ -1,17 +1,19 @@ package dev.jdtech.jellyfin.serverselect +import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import dev.jdtech.jellyfin.database.ServerDatabaseDao import java.lang.IllegalArgumentException class ServerSelectViewModelFactory( - private val dataSource: ServerDatabaseDao + private val dataSource: ServerDatabaseDao, + private val application: Application ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(ServerSelectViewModel::class.java)) { @Suppress("UNCHECKED_CAST") - return ServerSelectViewModel(dataSource) as T + return ServerSelectViewModel(dataSource, application) as T } throw IllegalArgumentException("Unknown ViewModel class") }