Start of view model for MediaInfoFragment

This commit is contained in:
Jarne Demeulemeester 2021-06-22 16:44:36 +02:00
parent ac10b4ba67
commit cb721ac988
No known key found for this signature in database
GPG key ID: 60884A0C1EBA43E5
4 changed files with 81 additions and 23 deletions

View file

@ -6,24 +6,35 @@ import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.navigation.fragment.navArgs
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel
import dev.jdtech.jellyfin.R import dev.jdtech.jellyfin.databinding.FragmentMediaInfoBinding
import dev.jdtech.jellyfin.viewmodels.MediaInfoViewModelFactory
class MediaInfoFragment : Fragment() { class MediaInfoFragment : Fragment() {
private lateinit var binding: FragmentMediaInfoBinding
private lateinit var viewModel: MediaInfoViewModel private lateinit var viewModel: MediaInfoViewModel
private val args: MediaInfoFragmentArgs by navArgs()
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
return inflater.inflate(R.layout.fragment_media_info, container, false) binding = FragmentMediaInfoBinding.inflate(inflater, container, false)
binding.lifecycleOwner = this
return binding.root
} }
override fun onActivityCreated(savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState) super.onViewCreated(view, savedInstanceState)
viewModel = ViewModelProvider(this).get(MediaInfoViewModel::class.java)
// TODO: Use the ViewModel val viewModelFactory = MediaInfoViewModelFactory(requireNotNull(this.activity).application, args.itemId)
viewModel = ViewModelProvider(this, viewModelFactory).get(MediaInfoViewModel::class.java)
binding.viewModel = viewModel
} }
} }

View file

@ -1,7 +1,35 @@
package dev.jdtech.jellyfin.viewmodels package dev.jdtech.jellyfin.viewmodels
import androidx.lifecycle.ViewModel import android.app.Application
import android.util.Log
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import dev.jdtech.jellyfin.api.JellyfinApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.jellyfin.sdk.model.api.BaseItemDto
import java.util.*
class MediaInfoViewModel : ViewModel() { class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) {
// TODO: Implement the ViewModel private val jellyfinApi = JellyfinApi.getInstance(application, "")
private val _item = MutableLiveData<BaseItemDto>()
val item: LiveData<BaseItemDto> = _item
init {
viewModelScope.launch {
_item.value = getItemDetails(itemId)
}
}
private suspend fun getItemDetails(itemId: UUID) : BaseItemDto {
val item: BaseItemDto
withContext(Dispatchers.IO) {
item = jellyfinApi.userLibraryApi.getItem(jellyfinApi.userId!!, itemId).content
}
return item
}
} }

View file

@ -0,0 +1,20 @@
package dev.jdtech.jellyfin.viewmodels
import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import java.lang.IllegalArgumentException
import java.util.*
class MediaInfoViewModelFactory(
private val application: Application,
private val itemId: UUID
) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(MediaInfoViewModel::class.java)) {
@Suppress("UNCHECKED_CAST")
return MediaInfoViewModel(application, itemId) as T
}
throw IllegalArgumentException("Unknown ViewModel class")
}
}

View file

@ -1,17 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout> <layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data> <data>
<variable <variable
name="item" name="viewModel"
type="org.jellyfin.sdk.model.api.BaseItemDto" /> type="dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel" />
</data> </data>
<LinearLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
@ -22,7 +21,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="12dp" android:layout_marginBottom="12dp"
android:text="@{item.originalTitle}" android:text="@{viewModel.item.originalTitle}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> android:textAppearance="@style/TextAppearance.AppCompat.Body1" />
<LinearLayout <LinearLayout
@ -36,7 +35,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:text="@{item.productionYear}" android:text="@{viewModel.item.productionYear.toString()}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="2019" /> tools:text="2019" />
@ -45,7 +44,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:text="@{item.runTimeTicks.toString()}" android:text="@{viewModel.item.runTimeTicks.toString()}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="122 min" /> tools:text="122 min" />
@ -54,7 +53,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginEnd="8dp" android:layout_marginEnd="8dp"
android:text="@{item.officialRating}" android:text="@{viewModel.item.officialRating}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="PG-13" /> tools:text="PG-13" />
@ -62,7 +61,7 @@
android:id="@+id/community_rating" android:id="@+id/community_rating"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@{item.communityRating.toString()}" android:text="@{viewModel.item.communityRating.toString()}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="7.3" /> tools:text="7.3" />
</LinearLayout> </LinearLayout>
@ -162,7 +161,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="24dp" android:layout_marginBottom="24dp"
android:text="@{item.overview}" android:text="@{viewModel.item.overview}"
android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:textAppearance="@style/TextAppearance.AppCompat.Body1"
tools:text="An angel falls. A warrior rises. When Alita awakens with no memory of who she is in a future world she does not recognize, she is taken in by Ido, a compassionate doctor who realizes that somewhere in this abandoned cyborg shell is the heart and soul of a young woman with an extraordinary past." /> tools:text="An angel falls. A warrior rises. When Alita awakens with no memory of who she is in a future world she does not recognize, she is taken in by Ido, a compassionate doctor who realizes that somewhere in this abandoned cyborg shell is the heart and soul of a young woman with an extraordinary past." />