diff --git a/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt b/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt index 35a56afe..b8346ed2 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/adapters/EpisodeListAdapter.kt @@ -8,7 +8,7 @@ import androidx.recyclerview.widget.RecyclerView import dev.jdtech.jellyfin.databinding.EpisodeItemBinding import org.jellyfin.sdk.model.api.BaseItemDto -class EpisodeListAdapter : +class EpisodeListAdapter(private val onClickListener: OnClickListener) : ListAdapter(DiffCallback) { class EpisodeViewHolder(private var binding: EpisodeItemBinding) : @@ -41,6 +41,13 @@ class EpisodeListAdapter : override fun onBindViewHolder(holder: EpisodeViewHolder, position: Int) { val item = getItem(position) + holder.itemView.setOnClickListener { + onClickListener.onClick(item) + } holder.bind(item) } + + class OnClickListener(val clickListener: (item: BaseItemDto) -> Unit) { + fun onClick(item: BaseItemDto) = clickListener(item) + } } \ No newline at end of file diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt index 2d2abbc2..a11da41c 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/HomeFragment.kt @@ -40,11 +40,24 @@ class HomeFragment : Fragment() { ) ) }, HomeEpisodeListAdapter.OnClickListener { - findNavController().navigate( - HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment( - it.id - ) - ) + when (it.type) { + "Episode" -> { + findNavController().navigate( + HomeFragmentDirections.actionNavigationHomeToEpisodeBottomSheetFragment( + it.id + ) + ) + } + "Movie" -> { + findNavController().navigate( + HomeFragmentDirections.actionNavigationHomeToMediaInfoFragment( + it.id, + it.name + ) + ) + } + } + }) binding.errorLayout.findViewById(R.id.retry_button).setOnClickListener { 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 3664814c..971d843d 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/MediaInfoFragment.kt @@ -58,6 +58,10 @@ class MediaInfoFragment : Fragment() { startActivity(intent) } + binding.nextUp.setOnClickListener { + findNavController().navigate(MediaInfoFragmentDirections.actionMediaInfoFragmentToEpisodeBottomSheetFragment(viewModel.nextUp.value!!.id)) + } + binding.seasonsRecyclerView.adapter = ViewItemListAdapter(ViewItemListAdapter.OnClickListener { findNavController().navigate( diff --git a/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt b/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt index 3273a59c..cbd41831 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/fragments/SeasonFragment.kt @@ -6,6 +6,7 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.navArgs import dev.jdtech.jellyfin.adapters.EpisodeListAdapter import dev.jdtech.jellyfin.databinding.FragmentSeasonBinding @@ -37,7 +38,14 @@ class SeasonFragment : Fragment() { ) viewModel = ViewModelProvider(this, viewModelFactory).get(SeasonViewModel::class.java) binding.viewModel = viewModel - binding.episodesRecyclerView.adapter = EpisodeListAdapter() + binding.episodesRecyclerView.adapter = + EpisodeListAdapter(EpisodeListAdapter.OnClickListener { + findNavController().navigate( + SeasonFragmentDirections.actionSeasonFragmentToEpisodeBottomSheetFragment( + it.id + ) + ) + }) binding.seriesName.text = args.seriesName binding.seasonName.text = args.seasonName binding.seriesId = args.seriesId diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt index a85cc872..629c738a 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -11,6 +11,8 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.jellyfin.sdk.model.api.BaseItemDto +import java.text.DateFormat +import java.time.ZoneOffset import java.util.* class EpisodeBottomSheetViewModel(application: Application, episodeId: UUID) : AndroidViewModel(application) { @@ -42,23 +44,13 @@ class EpisodeBottomSheetViewModel(application: Application, episodeId: UUID) : A } private fun getDateString(item: BaseItemDto): String { - val dateString: String = item.productionYear.toString() - return when (item.status) { - "Continuing" -> dateString.plus(" - Present") - "Ended" -> { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - return if (item.productionYear == item.endDate?.year) { - dateString - } else { - dateString.plus(" - ${item.endDate?.year}") - } - } else { - // TODO: Implement a way to get the year from LocalDateTime in Android < O - dateString - } - - } - else -> dateString + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val instant = item.premiereDate?.toInstant(ZoneOffset.UTC) + val date = Date.from(instant) + DateFormat.getDateInstance(DateFormat.SHORT).format(date) + } else { + // TODO: Implement a way to get the year from LocalDateTime in Android < O + item.premiereDate.toString() } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 00000000..65e4c714 --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/episode_bottom_sheet.xml b/app/src/main/res/layout/episode_bottom_sheet.xml index bc38ceb4..47b2ce24 100644 --- a/app/src/main/res/layout/episode_bottom_sheet.xml +++ b/app/src/main/res/layout/episode_bottom_sheet.xml @@ -13,7 +13,8 @@ + android:paddingBottom="24dp" + android:background="?android:attr/colorBackgroundFloating"> + app:shapeAppearance="@style/roundedImageView" /> @@ -55,8 +57,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginEnd="8dp" - android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:text="@{viewModel.dateString}" + android:textAppearance="@style/TextAppearance.AppCompat.Body1" tools:text="4/6/2013" /> + + @@ -124,8 +133,8 @@ android:layout_height="wrap_content" android:layout_marginHorizontal="24dp" android:layout_marginTop="12dp" - android:textAppearance="@style/TextAppearance.AppCompat.Body1" android:text="@{viewModel.item.overview}" + android:textAppearance="@style/TextAppearance.AppCompat.Body1" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/buttons" diff --git a/app/src/main/res/layout/fragment_media_info.xml b/app/src/main/res/layout/fragment_media_info.xml index eeaed5ff..747b70e7 100644 --- a/app/src/main/res/layout/fragment_media_info.xml +++ b/app/src/main/res/layout/fragment_media_info.xml @@ -73,7 +73,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginHorizontal="24dp" - android:layout_marginBottom="16dp"> + android:layout_marginBottom="16dp" + android:gravity="bottom"> + + - + android:foreground="?attr/selectableItemBackground" + android:orientation="vertical"> - + + + + diff --git a/app/src/main/res/navigation/main_navigation.xml b/app/src/main/res/navigation/main_navigation.xml index bf32a94d..5972e47d 100644 --- a/app/src/main/res/navigation/main_navigation.xml +++ b/app/src/main/res/navigation/main_navigation.xml @@ -85,6 +85,9 @@ + ?attr/colorPrimaryVariant @color/neutral_900 + @color/neutral_900 \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 3d93f1d5..d754cccf 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -13,5 +13,6 @@ ?attr/colorPrimaryVariant @color/neutral_100 + @color/neutral_100 \ No newline at end of file