From 6d340bd7ab54a972dd6f2058f89a880a56704027 Mon Sep 17 00:00:00 2001 From: jarnedemeulemeester Date: Wed, 15 Sep 2021 13:42:17 +0200 Subject: [PATCH] Add new player controls --- .../dev/jdtech/jellyfin/PlayerActivity.kt | 11 + .../dev/jdtech/jellyfin/models/PlayerItem.kt | 1 + .../viewmodels/EpisodeBottomSheetViewModel.kt | 3 +- .../jellyfin/viewmodels/MediaInfoViewModel.kt | 5 +- .../viewmodels/PlayerActivityViewModel.kt | 11 + app/src/main/res/drawable/ic_arrow_left.xml | 20 ++ .../main/res/drawable/ic_closed_caption.xml | 9 + app/src/main/res/drawable/ic_fast_forward.xml | 20 ++ app/src/main/res/drawable/ic_pause.xml | 20 ++ app/src/main/res/drawable/ic_rewind.xml | 20 ++ app/src/main/res/drawable/ic_skip_back.xml | 20 ++ app/src/main/res/drawable/ic_skip_forward.xml | 20 ++ app/src/main/res/drawable/ic_speaker.xml | 27 +++ .../transparent_circle_background.xml | 14 ++ app/src/main/res/layout/activity_player.xml | 4 +- .../layout/exo_player_styled_control_view.xml | 201 ++++++++++++++++++ app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/drawables.xml | 5 + 18 files changed, 409 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/ic_arrow_left.xml create mode 100644 app/src/main/res/drawable/ic_closed_caption.xml create mode 100644 app/src/main/res/drawable/ic_fast_forward.xml create mode 100644 app/src/main/res/drawable/ic_pause.xml create mode 100644 app/src/main/res/drawable/ic_rewind.xml create mode 100644 app/src/main/res/drawable/ic_skip_back.xml create mode 100644 app/src/main/res/drawable/ic_skip_forward.xml create mode 100644 app/src/main/res/drawable/ic_speaker.xml create mode 100644 app/src/main/res/drawable/transparent_circle_background.xml create mode 100644 app/src/main/res/layout/exo_player_styled_control_view.xml create mode 100644 app/src/main/res/values/drawables.xml diff --git a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt index a145a26a..e8fdce78 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/PlayerActivity.kt @@ -4,6 +4,7 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.view.WindowManager +import android.widget.TextView import androidx.activity.viewModels import androidx.navigation.navArgs import dagger.hilt.android.AndroidEntryPoint @@ -26,6 +27,16 @@ class PlayerActivity : AppCompatActivity() { binding.playerView.player = viewModel.player + binding.playerView.findViewById(R.id.back_button).setOnClickListener { + onBackPressed() + } + + val videoNameTextView = binding.playerView.findViewById(R.id.video_name) + + viewModel.currentItemTitle.observe(this, { title -> + videoNameTextView.text = title + }) + viewModel.navigateBack.observe(this, { if (it) { onBackPressed() diff --git a/app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt b/app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt index 726d62a3..0df53cf7 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/models/PlayerItem.kt @@ -6,6 +6,7 @@ import java.util.* @Parcelize data class PlayerItem( + val name: String?, val itemId: UUID, val mediaSourceId: String, val playbackPosition: Long 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 e09b18a8..33ff30b5 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/EpisodeBottomSheetViewModel.kt @@ -86,7 +86,7 @@ constructor( val intros = jellyfinRepository.getIntros(startEpisode.id) for (intro in intros) { if (intro.mediaSources.isNullOrEmpty()) continue - playerItems.add(PlayerItem(intro.id, intro.mediaSources?.get(0)?.id!!, 0)) + playerItems.add(PlayerItem(intro.name, intro.id, intro.mediaSources?.get(0)?.id!!, 0)) introsCount += 1 } } @@ -102,6 +102,7 @@ constructor( if (episode.locationType == LocationType.VIRTUAL) continue playerItems.add( PlayerItem( + episode.name, episode.id, episode.mediaSources?.get(0)?.id!!, playbackPosition 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 4b0a5485..ff032f3b 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/MediaInfoViewModel.kt @@ -202,7 +202,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { val intros = jellyfinRepository.getIntros(series.id) for (intro in intros) { if (intro.mediaSources.isNullOrEmpty()) continue - playerItems.add(PlayerItem(intro.id, intro.mediaSources?.get(0)?.id!!, 0)) + playerItems.add(PlayerItem(intro.name, intro.id, intro.mediaSources?.get(0)?.id!!, 0)) introsCount += 1 } } @@ -211,6 +211,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { "Movie" -> { playerItems.add( PlayerItem( + series.name, series.id, series.mediaSources?.get(mediaSourceIndex ?: 0)?.id!!, playbackPosition @@ -231,6 +232,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { if (episode.locationType == LocationType.VIRTUAL) continue playerItems.add( PlayerItem( + episode.name, episode.id, episode.mediaSources?.get(0)?.id!!, 0 @@ -250,6 +252,7 @@ constructor(private val jellyfinRepository: JellyfinRepository) : ViewModel() { if (episode.locationType == LocationType.VIRTUAL) continue playerItems.add( PlayerItem( + episode.name, episode.id, episode.mediaSources?.get(0)?.id!!, 0 diff --git a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt index c63a9fab..8ad468b6 100644 --- a/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt +++ b/app/src/main/java/dev/jdtech/jellyfin/viewmodels/PlayerActivityViewModel.kt @@ -32,6 +32,11 @@ constructor( private val _navigateBack = MutableLiveData() val navigateBack: LiveData = _navigateBack + private val _currentItemTitle = MutableLiveData() + val currentItemTitle: LiveData = _currentItemTitle + + private var items: Array = arrayOf() + var playWhenReady = true private var currentWindow = 0 private var playbackPosition: Long = 0 @@ -62,6 +67,7 @@ constructor( fun initializePlayer( items: Array ) { + this.items = items player.addListener(this) viewModelScope.launch { @@ -146,6 +152,11 @@ constructor( Timber.d("Playing MediaItem: ${mediaItem?.mediaId}") viewModelScope.launch { try { + for (item in items) { + if (item.itemId.toString() == player.currentMediaItem?.mediaId ?: "") { + _currentItemTitle.value = item.name + } + } jellyfinRepository.postPlaybackStart(UUID.fromString(mediaItem?.mediaId)) } catch (e: Exception) { Timber.e(e) diff --git a/app/src/main/res/drawable/ic_arrow_left.xml b/app/src/main/res/drawable/ic_arrow_left.xml new file mode 100644 index 00000000..adccd74d --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_left.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_closed_caption.xml b/app/src/main/res/drawable/ic_closed_caption.xml new file mode 100644 index 00000000..cd15b88a --- /dev/null +++ b/app/src/main/res/drawable/ic_closed_caption.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_fast_forward.xml b/app/src/main/res/drawable/ic_fast_forward.xml new file mode 100644 index 00000000..f241b31a --- /dev/null +++ b/app/src/main/res/drawable/ic_fast_forward.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_pause.xml b/app/src/main/res/drawable/ic_pause.xml new file mode 100644 index 00000000..c7c41e07 --- /dev/null +++ b/app/src/main/res/drawable/ic_pause.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_rewind.xml b/app/src/main/res/drawable/ic_rewind.xml new file mode 100644 index 00000000..ff2df095 --- /dev/null +++ b/app/src/main/res/drawable/ic_rewind.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_skip_back.xml b/app/src/main/res/drawable/ic_skip_back.xml new file mode 100644 index 00000000..f12a32aa --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_back.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_skip_forward.xml b/app/src/main/res/drawable/ic_skip_forward.xml new file mode 100644 index 00000000..177c4488 --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_forward.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_speaker.xml b/app/src/main/res/drawable/ic_speaker.xml new file mode 100644 index 00000000..e1f49ba4 --- /dev/null +++ b/app/src/main/res/drawable/ic_speaker.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/transparent_circle_background.xml b/app/src/main/res/drawable/transparent_circle_background.xml new file mode 100644 index 00000000..6d78ee5e --- /dev/null +++ b/app/src/main/res/drawable/transparent_circle_background.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_player.xml b/app/src/main/res/layout/activity_player.xml index fa68ff56..428cc72d 100644 --- a/app/src/main/res/layout/activity_player.xml +++ b/app/src/main/res/layout/activity_player.xml @@ -12,6 +12,8 @@ android:layout_height="match_parent" android:background="@color/black" app:show_subtitle_button="true" - app:show_buffering="always"/> + app:show_buffering="always" + app:controller_layout_id="@layout/exo_player_styled_control_view" + app:animation_enabled="false"/> diff --git a/app/src/main/res/layout/exo_player_styled_control_view.xml b/app/src/main/res/layout/exo_player_styled_control_view.xml new file mode 100644 index 00000000..89eedf8e --- /dev/null +++ b/app/src/main/res/layout/exo_player_styled_control_view.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index f230cfa6..4e95ff86 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -15,4 +15,5 @@ #FFFFFFFF #EB5757 #F2C94C + #AA000000 \ No newline at end of file diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml new file mode 100644 index 00000000..131b14cb --- /dev/null +++ b/app/src/main/res/values/drawables.xml @@ -0,0 +1,5 @@ + + + @drawable/ic_play + @drawable/ic_pause + \ No newline at end of file