mirror of
https://github.com/jellyfin/jellyfin-android.git
synced 2026-09-03 05:10:27 +03:00
Add basic playback info dialog
This commit is contained in:
@@ -4,8 +4,10 @@ import android.view.Menu
|
||||
import android.view.MenuItem
|
||||
import android.view.View
|
||||
import android.widget.PopupMenu
|
||||
import android.widget.TextView
|
||||
import androidx.core.view.forEach
|
||||
import androidx.core.view.get
|
||||
import androidx.core.view.isVisible
|
||||
import androidx.core.view.size
|
||||
import org.jellyfin.mobile.R
|
||||
import org.jellyfin.mobile.player.source.ExoPlayerTracksGroup
|
||||
@@ -17,8 +19,10 @@ import org.jellyfin.mobile.player.source.JellyfinMediaSource
|
||||
class PlaybackMenus(private val activity: PlayerActivity) : PopupMenu.OnDismissListener {
|
||||
private val subtitlesButton: View = activity.findViewById(R.id.subtitles_button)
|
||||
private val audioStreamsButton: View = activity.findViewById(R.id.audio_streams_button)
|
||||
private val infoButton: View = activity.findViewById(R.id.info_button)
|
||||
private val subtitlesMenu: PopupMenu = createSubtitlesMenu()
|
||||
private val audioStreamsMenu: PopupMenu = createAudioStreamsMenu()
|
||||
val playbackInfo: TextView = activity.findViewById(R.id.playback_info)
|
||||
|
||||
init {
|
||||
subtitlesButton.setOnClickListener {
|
||||
@@ -29,11 +33,24 @@ class PlaybackMenus(private val activity: PlayerActivity) : PopupMenu.OnDismissL
|
||||
activity.suppressControllerAutoHide(true)
|
||||
audioStreamsMenu.show()
|
||||
}
|
||||
infoButton.setOnClickListener {
|
||||
activity.suppressControllerAutoHide(true)
|
||||
playbackInfo.isVisible = !playbackInfo.isVisible
|
||||
}
|
||||
}
|
||||
|
||||
fun onItemChanged(item: JellyfinMediaSource) {
|
||||
buildMenuItems(subtitlesMenu.menu, SUBTITLES_MENU_GROUP, item.subtitleTracksGroup, true)
|
||||
buildMenuItems(audioStreamsMenu.menu, AUDIO_MENU_GROUP, item.audioTracksGroup)
|
||||
playbackInfo.text = activity.getString(R.string.playback_info,
|
||||
item.isTranscoding,
|
||||
item.videoTracksGroup.tracks.joinToString("\n") { video ->
|
||||
"- ${video.title}"
|
||||
},
|
||||
item.audioTracksGroup.tracks.joinToString("\n") { audio ->
|
||||
"- ${audio.title} (${audio.language})"
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private fun createSubtitlesMenu() = PopupMenu(activity, subtitlesButton).apply {
|
||||
|
||||
@@ -172,6 +172,9 @@ class PlayerActivity : AppCompatActivity() {
|
||||
// Handle double tap gesture on controls
|
||||
val gestureDetector = GestureDetector(this, object : GestureDetector.SimpleOnGestureListener() {
|
||||
override fun onDoubleTap(e: MotionEvent): Boolean {
|
||||
if (playbackMenus.playbackInfo.isVisible)
|
||||
return true
|
||||
|
||||
val viewWidth = playerView.measuredWidth
|
||||
val viewHeight = playerView.measuredHeight
|
||||
val viewCenterX = viewWidth / 2
|
||||
@@ -202,8 +205,13 @@ class PlayerActivity : AppCompatActivity() {
|
||||
|
||||
override fun onSingleTapConfirmed(e: MotionEvent?): Boolean {
|
||||
playerView.apply {
|
||||
if (!isControllerVisible) showController()
|
||||
else hideController()
|
||||
if (!isControllerVisible) {
|
||||
showController()
|
||||
} else {
|
||||
if (playbackMenus.playbackInfo.isVisible)
|
||||
playbackMenus.playbackInfo.isVisible = false
|
||||
hideController()
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="#ffffff"
|
||||
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM13,17h-2v-6h2v6zM13,9h-2L11,7h2v2z" />
|
||||
</vector>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<shape xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:shape="rectangle">
|
||||
<corners android:radius="16dp" />
|
||||
<solid android:color="@android:color/black" />
|
||||
</shape>
|
||||
@@ -77,6 +77,22 @@
|
||||
app:layout_constraintStart_toEndOf="@id/play_pause_container"
|
||||
app:layout_constraintTop_toTopOf="@id/play_pause_container" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/playback_info"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="@dimen/exo_player_controls_display_padding"
|
||||
android:background="@drawable/playback_info_background"
|
||||
android:clickable="true"
|
||||
android:padding="16dp"
|
||||
android:visibility="gone"
|
||||
app:layout_constraintBottom_toTopOf="@id/exo_progress"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:layout_constraintStart_toStartOf="parent"
|
||||
app:layout_constraintTop_toBottomOf="@id/track_title"
|
||||
tools:ignore="KeyboardInaccessibleWidget"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatTextView
|
||||
android:id="@+id/exo_position"
|
||||
android:layout_width="wrap_content"
|
||||
@@ -144,6 +160,17 @@
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/audio_streams_button" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/info_button"
|
||||
android:layout_width="@dimen/exo_bottom_controls_size"
|
||||
android:layout_height="@dimen/exo_bottom_controls_size"
|
||||
android:layout_marginBottom="@dimen/exo_bottom_controls_margin"
|
||||
android:background="@drawable/ripple_background_circular"
|
||||
android:padding="@dimen/exo_bottom_controls_padding"
|
||||
android:src="@drawable/ic_info_white_24dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintStart_toEndOf="@id/subtitles_button" />
|
||||
|
||||
<androidx.appcompat.widget.AppCompatImageButton
|
||||
android:id="@+id/fullscreen_switcher"
|
||||
android:layout_width="@dimen/exo_bottom_controls_size"
|
||||
@@ -155,4 +182,4 @@
|
||||
android:src="@drawable/ic_fullscreen_enter_white_32dp"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent" />
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
<string name="downloading">Downloading</string>
|
||||
|
||||
<string name="menu_item_none">None</string>
|
||||
<string name="playback_info">Transcoding: %b\n\nVideo streams:\n%s\n\nAudio streams:\n%s</string>
|
||||
|
||||
<string name="activity_name_settings">Jellyfin Settings</string>
|
||||
<string name="pref_category_music_player">Music player</string>
|
||||
|
||||
Reference in New Issue
Block a user