mirror of
https://github.com/libre-tube/LibreTube.git
synced 2024-12-15 06:40:30 +05:30
dynamic chapter name
This commit is contained in:
parent
b38cb661d0
commit
1202049d7b
@ -90,7 +90,9 @@ import kotlinx.coroutines.launch
|
|||||||
import org.chromium.net.CronetEngine
|
import org.chromium.net.CronetEngine
|
||||||
import retrofit2.HttpException
|
import retrofit2.HttpException
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.util.*
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
import kotlin.collections.ArrayList
|
||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
var isFullScreen = false
|
var isFullScreen = false
|
||||||
@ -137,6 +139,7 @@ class PlayerFragment : Fragment() {
|
|||||||
private lateinit var title: String
|
private lateinit var title: String
|
||||||
private lateinit var uploader: String
|
private lateinit var uploader: String
|
||||||
private lateinit var thumbnailUrl: String
|
private lateinit var thumbnailUrl: String
|
||||||
|
private lateinit var chapters: List<ChapterSegment>
|
||||||
private val sponsorBlockPrefs = SponsorBlockPrefs()
|
private val sponsorBlockPrefs = SponsorBlockPrefs()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
@ -335,7 +338,7 @@ class PlayerFragment : Fragment() {
|
|||||||
binding.linLayout.visibility = View.GONE
|
binding.linLayout.visibility = View.GONE
|
||||||
playerBinding.fullscreen.setImageResource(R.drawable.ic_fullscreen_exit)
|
playerBinding.fullscreen.setImageResource(R.drawable.ic_fullscreen_exit)
|
||||||
playerBinding.exoTitle.visibility = View.VISIBLE
|
playerBinding.exoTitle.visibility = View.VISIBLE
|
||||||
playerBinding.chapterName.visibility = View.VISIBLE
|
if (chapters.isNotEmpty()) playerBinding.chapterLL.visibility = View.VISIBLE
|
||||||
|
|
||||||
val mainActivity = activity as MainActivity
|
val mainActivity = activity as MainActivity
|
||||||
val fullscreenOrientationPref = PreferenceHelper
|
val fullscreenOrientationPref = PreferenceHelper
|
||||||
@ -373,7 +376,7 @@ class PlayerFragment : Fragment() {
|
|||||||
binding.linLayout.visibility = View.VISIBLE
|
binding.linLayout.visibility = View.VISIBLE
|
||||||
playerBinding.fullscreen.setImageResource(R.drawable.ic_fullscreen)
|
playerBinding.fullscreen.setImageResource(R.drawable.ic_fullscreen)
|
||||||
playerBinding.exoTitle.visibility = View.INVISIBLE
|
playerBinding.exoTitle.visibility = View.INVISIBLE
|
||||||
playerBinding.chapterName.visibility = View.INVISIBLE
|
playerBinding.chapterLL.visibility = View.INVISIBLE
|
||||||
|
|
||||||
scaleControls(1F)
|
scaleControls(1F)
|
||||||
|
|
||||||
@ -712,7 +715,10 @@ class PlayerFragment : Fragment() {
|
|||||||
enableDoubleTapToSeek()
|
enableDoubleTapToSeek()
|
||||||
|
|
||||||
// init the chapters recyclerview
|
// init the chapters recyclerview
|
||||||
if (response.chapters != null) initializeChapters(response.chapters)
|
if (response.chapters != null) {
|
||||||
|
chapters = response.chapters
|
||||||
|
initializeChapters()
|
||||||
|
}
|
||||||
|
|
||||||
// Listener for play and pause icon change
|
// Listener for play and pause icon change
|
||||||
exoPlayer.addListener(object : Player.Listener {
|
exoPlayer.addListener(object : Player.Listener {
|
||||||
@ -938,7 +944,7 @@ class PlayerFragment : Fragment() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun initializeChapters(chapters: List<ChapterSegment>) {
|
private fun initializeChapters() {
|
||||||
if (chapters.isNotEmpty()) {
|
if (chapters.isNotEmpty()) {
|
||||||
// enable chapters in the video description
|
// enable chapters in the video description
|
||||||
binding.chaptersRecView.layoutManager =
|
binding.chaptersRecView.layoutManager =
|
||||||
@ -955,8 +961,7 @@ class PlayerFragment : Fragment() {
|
|||||||
chapters.forEach {
|
chapters.forEach {
|
||||||
titles += it.title!!
|
titles += it.title!!
|
||||||
}
|
}
|
||||||
playerBinding.chapterName.text = chapters[0].title
|
playerBinding.chapterLL.setOnClickListener {
|
||||||
playerBinding.chapterName.setOnClickListener{
|
|
||||||
MaterialAlertDialogBuilder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
.setTitle(R.string.chapters)
|
.setTitle(R.string.chapters)
|
||||||
.setItems(titles.toTypedArray()) { _, index ->
|
.setItems(titles.toTypedArray()) { _, index ->
|
||||||
@ -965,9 +970,31 @@ class PlayerFragment : Fragment() {
|
|||||||
}
|
}
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
setCurrentChapterName()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set the name of the video chapter in the exoPlayerView
|
||||||
|
private fun setCurrentChapterName() {
|
||||||
|
// call the function again in 100ms
|
||||||
|
exoPlayerView.postDelayed(this::setCurrentChapterName, 100)
|
||||||
|
|
||||||
|
val currentPosition = exoPlayer.currentPosition
|
||||||
|
var chapterName: String? = null
|
||||||
|
val reversedChapters = chapters.toMutableList()
|
||||||
|
|
||||||
|
// reverse the chapters to start at the end
|
||||||
|
reversedChapters.reverse()
|
||||||
|
reversedChapters.forEach {
|
||||||
|
// check whether the chapter start is greater than the current player position
|
||||||
|
if (it.start!! * 1000 >= currentPosition) chapterName = it.title
|
||||||
|
}
|
||||||
|
Log.e(TAG, chapterName.toString())
|
||||||
|
// change the chapter name textView text to the chapterName
|
||||||
|
if (chapterName != null && chapterName != playerBinding.chapterName.text)
|
||||||
|
playerBinding.chapterName.text = chapterName
|
||||||
|
}
|
||||||
|
|
||||||
private fun setMediaSource(
|
private fun setMediaSource(
|
||||||
subtitle: MutableList<SubtitleConfiguration>,
|
subtitle: MutableList<SubtitleConfiguration>,
|
||||||
videoUri: Uri,
|
videoUri: Uri,
|
||||||
|
11
app/src/main/res/drawable/ic_arrow_right.xml
Normal file
11
app/src/main/res/drawable/ic_arrow_right.xml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:autoMirrored="true"
|
||||||
|
android:tint="@android:color/white"
|
||||||
|
android:viewportWidth="24"
|
||||||
|
android:viewportHeight="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="@android:color/white"
|
||||||
|
android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z" />
|
||||||
|
</vector>
|
@ -137,17 +137,26 @@
|
|||||||
style="@style/ExoStyledControls.TimeText.Duration" />
|
style="@style/ExoStyledControls.TimeText.Duration" />
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/chapter_fullscreen"
|
android:id="@+id/chapterLL"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginStart="20dp"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/chapter_name"
|
android:id="@+id/chapter_name"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginStart="20dp"
|
android:layout_gravity="center"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp" />
|
||||||
android:visibility="gone" />
|
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="15dp"
|
||||||
|
android:layout_height="15dp"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:layout_marginTop="2dp"
|
||||||
|
android:layout_marginStart="3dp"
|
||||||
|
android:src="@drawable/ic_arrow_right" />
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user