Skip to content
Snippets Groups Projects
Commit a7341b98 authored by Nicolas Pomepuy's avatar Nicolas Pomepuy
Browse files

Bookmarks for the TV audio player

parent 5b0a0d7c
No related branches found
No related tags found
1 merge request!972Bookmarks implementation
......@@ -28,10 +28,7 @@ import android.os.Bundle
import android.os.Handler
import android.support.v4.media.session.PlaybackStateCompat
import android.text.format.DateFormat
import android.view.InputDevice
import android.view.KeyEvent
import android.view.MotionEvent
import android.view.View
import android.view.*
import android.widget.SeekBar
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.ViewModelProvider
......@@ -53,6 +50,7 @@ import org.videolan.vlc.gui.dialogs.SleepTimerDialog
import org.videolan.vlc.gui.helpers.*
import org.videolan.vlc.media.MediaUtils
import org.videolan.vlc.util.getScreenWidth
import org.videolan.vlc.viewmodels.BookmarkModel
import org.videolan.vlc.viewmodels.PlayerState
import org.videolan.vlc.viewmodels.PlaylistModel
import java.lang.Runnable
......@@ -74,6 +72,8 @@ class AudioPlayerActivity : BaseTvActivity() {
private lateinit var pauseToPlay: AnimatedVectorDrawableCompat
private lateinit var playToPause: AnimatedVectorDrawableCompat
private lateinit var optionsDelegate: PlayerOptionsDelegate
lateinit var bookmarkModel: BookmarkModel
private lateinit var bookmarkListDelegate: BookmarkListDelegate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
......@@ -124,6 +124,7 @@ class AudioPlayerActivity : BaseTvActivity() {
showChips()
true
}
bookmarkModel = BookmarkModel.get(this)
}
private var timelineListener: SeekBar.OnSeekBarChangeListener = object : SeekBar.OnSeekBarChangeListener {
......@@ -157,6 +158,10 @@ class AudioPlayerActivity : BaseTvActivity() {
optionsDelegate.hide()
return
}
if (::bookmarkListDelegate.isInitialized && bookmarkListDelegate.visible) {
bookmarkListDelegate.hide()
return
}
super.onBackPressed()
}
......@@ -288,6 +293,20 @@ class AudioPlayerActivity : BaseTvActivity() {
if (!this::optionsDelegate.isInitialized) {
val service = model.service ?: return
optionsDelegate = PlayerOptionsDelegate(this, service, false)
optionsDelegate.setBookmarkClickedListener {
if (!this::bookmarkListDelegate.isInitialized) {
bookmarkListDelegate = BookmarkListDelegate(this, service, bookmarkModel)
bookmarkListDelegate.visibilityListener = {
if (bookmarkListDelegate.visible) bookmarkListDelegate.rootView.requestFocus()
binding.playlist.descendantFocusability = if (bookmarkListDelegate.visible) ViewGroup.FOCUS_BLOCK_DESCENDANTS else ViewGroup.FOCUS_AFTER_DESCENDANTS
binding.playlist.isFocusable = !bookmarkListDelegate.visible
binding.sleepQuickAction.isFocusable = !bookmarkListDelegate.visible
binding.playbackSpeedQuickAction.isFocusable = !bookmarkListDelegate.visible
}
bookmarkListDelegate.markerContainer = binding.bookmarkMarkerContainer
}
bookmarkListDelegate.show()
}
}
optionsDelegate.show()
}
......
......@@ -90,6 +90,18 @@
app:layout_constraintTop_toBottomOf="@+id/media_title"
tools:text="Artist" />
<androidx.appcompat.widget.ViewStubCompat
android:id="@+id/bookmarks_stub"
android:layout_width="500dp"
android:layout_height="0dp"
android:layout="@layout/bookmarks"
android:layout_marginTop="@dimen/tv_overscan_vertical"
android:layout_marginBottom="17dp"
app:layout_constraintBottom_toBottomOf="@id/media_progress"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline8"
android:layout_width="wrap_content"
......@@ -170,6 +182,17 @@
app:barrierDirection="bottom"
app:constraint_referenced_ids="sleep_quick_action,playback_speed_quick_action" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/bookmark_marker_container"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="@+id/media_progress"
app:layout_constraintEnd_toEndOf="@+id/media_progress"
app:layout_constraintStart_toStartOf="@+id/media_progress" />
<TextView
android:id="@+id/media_time"
android:layout_width="wrap_content"
......
......@@ -87,7 +87,7 @@
app:layout_constraintTop_toBottomOf="@+id/audio_item_title"
tools:text="12:38" />
<ImageButton
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/item_more"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......
......@@ -17,7 +17,7 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -26,6 +26,7 @@
android:clickable="true"
android:focusable="true"
android:padding="8dp"
android:nextFocusRight="@+id/add_bookmark"
app:layout_constraintBottom_toBottomOf="@+id/top_bar"
app:layout_constraintEnd_toStartOf="@+id/title"
app:layout_constraintHorizontal_bias="0.5"
......@@ -48,7 +49,7 @@
app:layout_constraintStart_toEndOf="@+id/close"
app:layout_constraintTop_toTopOf="@+id/top_bar" />
<ImageView
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/add_bookmark"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
......@@ -57,6 +58,7 @@
android:clickable="true"
android:focusable="true"
android:padding="8dp"
android:nextFocusLeft="@+id/close"
app:layout_constraintBottom_toBottomOf="@+id/top_bar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
......
......@@ -259,6 +259,7 @@
<item name="colorPrimaryDark">@color/transparent</item>
<item name="colorAccent">@color/orange600</item>
<item name="font_default">@color/white</item>
<item name="font_audio_light">@color/grey600</item>
<item name="imageCardViewInfoAreaStyle">@style/VLCardViewInfoStyle</item>
<item name="imageCardViewTitleStyle">@style/VLCardViewTitleStyle</item>
<item name="imageCardViewStyle">@style/VLCardView</item>
......@@ -284,6 +285,10 @@
<item name="ic_save">@drawable/ic_save_w</item>
<item name="ic_passthrough">@drawable/ic_passthrough_w</item>
<item name="colorControlNormal">@color/grey700</item>
<item name="bookmark_background">@color/black_transparent_80</item>
<item name="background_default">@color/grey850</item>
<item name="actionBarItemBackground">@drawable/ic_circle_audio_player</item>
<item name="selectableItemBackgroundBorderless">@drawable/ic_circle_audio_player</item>
</style>
......
......@@ -56,8 +56,8 @@ class BookmarkListDelegate(val activity: FragmentActivity, val service: Playback
lateinit var markerContainer: ConstraintLayout
private lateinit var adapter: BookmarkAdapter
private lateinit var recyclerview: RecyclerView
private lateinit var rootView: ConstraintLayout
lateinit var bookmarkList: RecyclerView
lateinit var rootView: ConstraintLayout
private lateinit var emptyView: View
lateinit var visibilityListener: () -> Unit
val visible: Boolean
......@@ -66,7 +66,7 @@ class BookmarkListDelegate(val activity: FragmentActivity, val service: Playback
fun show() {
activity.findViewById<ViewStubCompat>(R.id.bookmarks_stub)?.let {
rootView = it.inflate() as ConstraintLayout
recyclerview = rootView.findViewById(R.id.bookmark_list)
bookmarkList = rootView.findViewById(R.id.bookmark_list)
rootView.findViewById<ImageView>(R.id.close).setOnClickListener { hide() }
rootView.findViewById<ImageView>(R.id.add_bookmark).setOnClickListener { bookmarkModel.addBookmark(activity) }
rootView.findViewById<View>(R.id.top_bar).setOnTouchListener { v, event ->
......@@ -76,10 +76,10 @@ class BookmarkListDelegate(val activity: FragmentActivity, val service: Playback
emptyView = rootView.findViewById(R.id.empty_view)
service.lifecycle.addObserver(this)
activity.lifecycle.addObserver(this)
if (recyclerview.layoutManager == null) recyclerview.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
if (bookmarkList.layoutManager == null) bookmarkList.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
adapter = BookmarkAdapter(this)
recyclerview.adapter = adapter
recyclerview.itemAnimator = null
bookmarkList.adapter = adapter
bookmarkList.itemAnimator = null
bookmarkModel.dataset.observe(activity, { bookmarkList ->
adapter.update(bookmarkList)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment