diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt index 6945061b..5c2f9b4a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -6,24 +6,35 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.navigation.fragment.navArgs 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() { + private lateinit var binding: FragmentMediaInfoBinding private lateinit var viewModel: MediaInfoViewModel + private val args: MediaInfoFragmentArgs by navArgs() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? - ): View? { - return inflater.inflate(R.layout.fragment_media_info, container, false) + ): View { + binding = FragmentMediaInfoBinding.inflate(inflater, container, false) + + binding.lifecycleOwner = this + + return binding.root } - override fun onActivityCreated(savedInstanceState: Bundle?) { - super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProvider(this).get(MediaInfoViewModel::class.java) - // TODO: Use the ViewModel + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + val viewModelFactory = MediaInfoViewModelFactory(requireNotNull(this.activity).application, args.itemId) + viewModel = ViewModelProvider(this, viewModelFactory).get(MediaInfoViewModel::class.java) + binding.viewModel = viewModel } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt index 34d51988..cbb1336d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -1,7 +1,35 @@ 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() { - // TODO: Implement the ViewModel +class MediaInfoViewModel(application: Application, itemId: UUID) : AndroidViewModel(application) { + private val jellyfinApi = JellyfinApi.getInstance(application, "") + + private val _item = MutableLiveData() + val item: LiveData = _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 + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt new file mode 100644 index 00000000..0fe48a75 --- /dev/null +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModelFactory.kt @@ -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 create(modelClass: Class): T { + if (modelClass.isAssignableFrom(MediaInfoViewModel::class.java)) { + @Suppress("UNCHECKED_CAST") + return MediaInfoViewModel(application, itemId) as T + } + throw IllegalArgumentException("Unknown ViewModel class") + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index d10c36e5..239e5b36 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -1,17 +1,16 @@ - + + name="viewModel" + type="dev.jdtech.jellyfin.viewmodels.MediaInfoViewModel" /> - - @@ -45,7 +44,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:text="@{item.runTimeTicks.toString()}" + android:text="@{viewModel.item.runTimeTicks.toString()}" android:textAppearance="@style/TextAppearance.AppCompat.Body1" tools:text="122 min" /> @@ -54,7 +53,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:text="@{item.officialRating}" + android:text="@{viewModel.item.officialRating}" android:textAppearance="@style/TextAppearance.AppCompat.Body1" tools:text="PG-13" /> @@ -62,7 +61,7 @@ android:id="@+id/community_rating" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="@{item.communityRating.toString()}" + android:text="@{viewModel.item.communityRating.toString()}" android:textAppearance="@style/TextAppearance.AppCompat.Body1" tools:text="7.3" /> @@ -162,7 +161,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="24dp" - android:text="@{item.overview}" + android:text="@{viewModel.item.overview}" 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." />