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

Allow showing the tips again

parent 6c61e173
No related branches found
No related tags found
1 merge request!1062Allow showing the tips again
Pipeline #126112 passed with stage
in 2 minutes and 56 seconds
Showing with 119 additions and 58 deletions
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:autoMirrored="true">
<path
android:fillColor="@color/standard_selection_control_normal"
android:pathData="M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z"/>
</vector>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:autoMirrored="true">
<path
android:fillColor="@color/standard_selection"
android:pathData="M11,18h2v-2h-2v2zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM12,6c-2.21,0 -4,1.79 -4,4h2c0,-1.1 0.9,-2 2,-2s2,0.9 2,2c0,2 -3,1.75 -3,5h2c0,-2.25 3,-2.5 3,-5 0,-2.21 -1.79,-4 -4,-4z"/>
</vector>
......@@ -103,6 +103,7 @@
<attr name="ic_lock_player" format="reference" />
<attr name="player_icon_color" format="reference" />
<attr name="dialog_circle_background" format="reference"/>
<attr name="ic_tips" format="reference"/>
<attr name="advanced_options_bg" format="reference"/>
......
......@@ -85,6 +85,7 @@
<item name="ic_popup_dim">@drawable/ic_popup_dim</item>
<item name="ic_speed_normal_style">@drawable/ic_speed</item>
<item name="ic_sleep_normal_style">@drawable/ic_sleep</item>
<item name="ic_tips">@drawable/ic_show_tips</item>
<item name="ic_jumpto_normal_style">@drawable/ic_jumpto</item>
<item name="ic_chapter_normal_style">@drawable/ic_chapter</item>
<item name="ic_bookmark_normal_style">@drawable/ic_bookmark</item>
......@@ -244,6 +245,7 @@
<item name="ic_popup_dim">@drawable/ic_popup_dim_w</item>
<item name="ic_speed_normal_style">@drawable/ic_speed_w</item>
<item name="ic_sleep_normal_style">@drawable/ic_sleep_w</item>
<item name="ic_tips">@drawable/ic_show_tips_w</item>
<item name="ic_jumpto_normal_style">@drawable/ic_jumpto_w</item>
<item name="ic_chapter_normal_style">@drawable/ic_chapter_w</item>
<item name="ic_bookmark_normal_style">@drawable/ic_bookmark_w</item>
......@@ -307,6 +309,7 @@
<item name="advanced_options_bg">@drawable/advanced_options_background_dark</item>
<item name="ic_speed_normal_style">@drawable/ic_speed_w</item>
<item name="ic_sleep_normal_style">@drawable/ic_sleep_w</item>
<item name="ic_tips">@drawable/ic_show_tips_w</item>
<item name="ic_jumpto_normal_style">@drawable/ic_jumpto_w</item>
<item name="ic_chapter_normal_style">@drawable/ic_chapter_w</item>
<item name="ic_bookmark_normal_style">@drawable/ic_bookmark_w</item>
......@@ -457,6 +460,7 @@
<item name="ic_popup_dim">@drawable/ic_popup_dim_w</item>
<item name="ic_speed_normal_style">@drawable/ic_speed_w</item>
<item name="ic_sleep_normal_style">@drawable/ic_sleep_w</item>
<item name="ic_tips">@drawable/ic_show_tips_w</item>
<item name="ic_jumpto_normal_style">@drawable/ic_jumpto_w</item>
<item name="ic_chapter_normal_style">@drawable/ic_chapter_w</item>
<item name="ic_bookmark_normal_style">@drawable/ic_bookmark_w</item>
......
......@@ -270,11 +270,11 @@ open class AudioPlayerContainerActivity : BaseActivity() {
@SuppressLint("RestrictedApi")
fun showTipViewIfNeeded(stubId: Int, settingKey: String) {
if (BuildConfig.DEBUG || PlaybackService.hasRenderer()) return
val vsc = findViewById<View>(stubId)
val vsc = findViewById<ViewStubCompat>(stubId)
if (vsc != null && !settings.getBoolean(settingKey, false) && !Settings.showTvUi) {
when (stubId) {
R.id.audio_player_tips -> if (tipsDelegate.currentTip == null && !shownTips.contains(stubId)) tipsDelegate.init((vsc as ViewStubCompat))
R.id.audio_playlist_tips -> if (playlistTipsDelegate.currentTip == null && !shownTips.contains(stubId)) playlistTipsDelegate.init((vsc as ViewStubCompat))
R.id.audio_player_tips -> if (tipsDelegate.currentTip == null && !shownTips.contains(stubId)) tipsDelegate.init(vsc)
R.id.audio_playlist_tips -> if (playlistTipsDelegate.currentTip == null && !shownTips.contains(stubId)) playlistTipsDelegate.init(vsc)
}
if (::audioPlayer.isInitialized) audioPlayer.playlistModel.service?.pause()
}
......
......@@ -45,10 +45,7 @@ import androidx.lifecycle.ViewModelProvider
import androidx.transition.Fade
import androidx.transition.TransitionManager
import kotlinx.android.synthetic.main.audio_playlist_tips.*
import org.videolan.tools.PREF_AUDIOPLAYER_TIPS_SHOWN
import org.videolan.tools.Settings
import org.videolan.tools.dp
import org.videolan.tools.putSingle
import org.videolan.tools.*
import org.videolan.vlc.R
import org.videolan.vlc.databinding.PlaylistItemBinding
import org.videolan.vlc.gui.AudioPlayerContainerActivity
......@@ -69,46 +66,49 @@ class AudioPlaylistTipsDelegate(private val activity: AudioPlayerContainerActivi
fun init(vsc: ViewStubCompat) {
vsc.inflate()
fun init(vsc: ViewStubCompat?) {
vsc?.inflate()
activity.lockPlayer(true)
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(activity.audioPlaylistTips)
//populate fake tracks
val playlistModel = ViewModelProvider(activity).get(PlaylistModel::class.java)
playlistModel.currentMediaWrapper?.let {
for (i in 0..10) {
val v = LayoutInflater.from(activity)
.inflate(R.layout.playlist_item, activity.tracksContainer, false)
var binding: PlaylistItemBinding = DataBindingUtil.bind(v)!!
binding.media = it
binding.scaleType = ImageView.ScaleType.CENTER_CROP
binding.subTitle = MediaUtils.getMediaSubtitle(it)
activity.tracksContainer.addView(v)
if (i == 2) {
binding.playing.stop()
binding.playing.visibility = View.VISIBLE
binding.coverImage.visibility = View.INVISIBLE
binding.audioItemTitle.setTypeface(null, Typeface.BOLD)
binding.audioItemSubtitle.setTypeface(null, Typeface.BOLD)
} else {
binding.playing.stop()
binding.playing.visibility = View.INVISIBLE
binding.audioItemTitle.typeface = null
binding.coverImage.visibility = View.VISIBLE
}
binding.masked = true
if (i == 1) {
binding.masked = false
binding.itemContainer.setBackgroundColor(getItemColor())
secondItemBinding = binding
} else if( i==2) thirdItemBinding = binding
if (!::initialConstraintSet.isInitialized) {
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(activity.audioPlaylistTips)
}
if (activity.tracksContainer.childCount == 0) {
//populate fake tracks
val playlistModel = ViewModelProvider(activity).get(PlaylistModel::class.java)
playlistModel.currentMediaWrapper?.let {
for (i in 0..10) {
val v = LayoutInflater.from(activity)
.inflate(R.layout.playlist_item, activity.tracksContainer, false)
var binding: PlaylistItemBinding = DataBindingUtil.bind(v)!!
binding.media = it
binding.scaleType = ImageView.ScaleType.CENTER_CROP
binding.subTitle = MediaUtils.getMediaSubtitle(it)
activity.tracksContainer.addView(v)
if (i == 2) {
binding.playing.stop()
binding.playing.visibility = View.VISIBLE
binding.coverImage.visibility = View.INVISIBLE
binding.audioItemTitle.setTypeface(null, Typeface.BOLD)
binding.audioItemSubtitle.setTypeface(null, Typeface.BOLD)
} else {
binding.playing.stop()
binding.playing.visibility = View.INVISIBLE
binding.audioItemTitle.typeface = null
binding.coverImage.visibility = View.VISIBLE
}
binding.masked = true
if (i == 1) {
binding.masked = false
binding.itemContainer.setBackgroundColor(getItemColor())
secondItemBinding = binding
} else if (i == 2) thirdItemBinding = binding
}
}
}
activity.audioPlaylistTips.setVisible()
next()
}
......@@ -249,6 +249,7 @@ class AudioPlaylistTipsDelegate(private val activity: AudioPlayerContainerActivi
clearAllAnimations()
activity.nextButton.setText(R.string.next)
when (currentTip) {
AudioPlaylistTipsStep.REMOVE -> {
......@@ -285,6 +286,7 @@ class AudioPlaylistTipsDelegate(private val activity: AudioPlayerContainerActivi
constraintSet.connect(R.id.helpTitle, ConstraintSet.BOTTOM, R.id.guideline8, ConstraintSet.TOP, 72.dp)
currentAnimations.clear()
currentAnimations.add(longTapSeek(activity.tapIndicatorRewind, activity.tapIndicatorForward, activity.plTipsTimeline))
activity.nextButton.setText(R.string.close)
}
}
......@@ -299,7 +301,7 @@ class AudioPlaylistTipsDelegate(private val activity: AudioPlayerContainerActivi
*/
fun close() {
clearAllAnimations()
(activity.audioPlaylistTips.parent as? ViewGroup)?.removeView(activity.audioPlaylistTips)
activity.audioPlaylistTips.setGone()
Settings.getInstance(activity).putSingle(PREF_AUDIOPLAYER_TIPS_SHOWN, true)
currentTip = null
activity.audioPlayer.playlistModel.service?.play()
......
......@@ -26,7 +26,6 @@ package org.videolan.vlc.gui.audio
import android.animation.Animator
import android.view.View
import android.view.ViewGroup
import android.view.animation.AccelerateDecelerateInterpolator
import android.widget.TextView
import androidx.annotation.StringRes
......@@ -35,12 +34,17 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.constraintlayout.widget.ConstraintSet
import androidx.transition.Fade
import androidx.transition.TransitionManager
import com.google.android.material.bottomsheet.BottomSheetBehavior
import kotlinx.android.synthetic.main.audio_player_tips.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.ObsoleteCoroutinesApi
import org.videolan.tools.*
import org.videolan.vlc.R
import org.videolan.vlc.gui.AudioPlayerContainerActivity
import org.videolan.vlc.gui.helpers.TipsUtils
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
class AudioTipsDelegate(private val activity: AudioPlayerContainerActivity) {
var currentTip: AudioPlayerTipsStep? = null
private lateinit var initialConstraintSet: ConstraintSet
......@@ -50,16 +54,18 @@ class AudioTipsDelegate(private val activity: AudioPlayerContainerActivity) {
}
private val currentAnimations = ArrayList<Animator>()
fun init(vsc: ViewStubCompat) {
vsc.inflate()
fun init(vsc: ViewStubCompat?) {
vsc?.inflate()
activity.playerBehavior.state = BottomSheetBehavior.STATE_COLLAPSED
activity.playerBehavior.lock(true)
activity.playerBehavior.setPeekHeightListener {
updateBackgroundPosition(it)
}
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(activity.audioPlayerTips)
if (!::initialConstraintSet.isInitialized) {
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(activity.audioPlayerTips)
}
activity.audioPlayerTips.setVisible()
activity.audioPlayerTips.setOnTouchListener { _, _ -> true }
next()
}
......@@ -85,6 +91,7 @@ class AudioTipsDelegate(private val activity: AudioPlayerContainerActivity) {
clearAllAnimations()
activity.nextButton.setText(R.string.next)
when (currentTip) {
AudioPlayerTipsStep.SWIPE_NEXT -> {
......@@ -116,7 +123,7 @@ class AudioTipsDelegate(private val activity: AudioPlayerContainerActivity) {
*/
fun close() {
clearAllAnimations()
(activity.audioPlayerTips.parent as? ViewGroup)?.removeView(activity.audioPlayerTips)
activity.audioPlayerTips.setGone()
activity.playerBehavior.removePeekHeightListener()
Settings.getInstance(activity).putSingle(PREF_AUDIOPLAYER_TIPS_SHOWN, true)
currentTip = null
......
......@@ -22,12 +22,11 @@ import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.coroutines.*
import org.videolan.resources.*
import org.videolan.tools.AppScope
import org.videolan.tools.Settings
import org.videolan.tools.formatRateString
import org.videolan.tools.*
import org.videolan.vlc.PlaybackService
import org.videolan.vlc.R
import org.videolan.vlc.databinding.PlayerOptionItemBinding
import org.videolan.vlc.gui.AudioPlayerContainerActivity
import org.videolan.vlc.gui.DiffUtilAdapter
import org.videolan.vlc.gui.audio.EqualizerFragment
import org.videolan.vlc.gui.dialogs.*
......@@ -54,7 +53,9 @@ private const val ID_PASSTHROUGH = 12L
private const val ID_ABREPEAT = 13L
private const val ID_LOCK_PLAYER = 14L
private const val ID_VIDEO_STATS = 15L
private const val ID_SHOW_VIDEO_TIPS = 16L
private const val ID_SHOW_AUDIO_TIPS = 17L
private const val ID_SHOW_PLAYLIST_TIPS = 18L
@ObsoleteCoroutinesApi
@ExperimentalCoroutinesApi
@SuppressLint("ShowToast")
......@@ -116,6 +117,12 @@ class PlayerOptionsDelegate(val activity: FragmentActivity, val service: Playbac
if (service.playlistManager.player.canDoPassthrough() && settings.getString("aout", "0") == "0")
options.add(PlayerOption(ID_PASSTHROUGH, R.attr.ic_passthrough, res.getString(R.string.audio_digital_title)))
(recyclerview.adapter as OptionsAdapter).update(options)
if (video) {
options.add(PlayerOption(ID_SHOW_VIDEO_TIPS, R.attr.ic_tips, res.getString(R.string.tips_title)))
} else {
options.add(PlayerOption(ID_SHOW_AUDIO_TIPS, R.attr.ic_tips, res.getString(R.string.audio_player_tips)))
options.add(PlayerOption(ID_SHOW_PLAYLIST_TIPS, R.attr.ic_tips, res.getString(R.string.playlist_tips)))
}
}
fun show() {
......@@ -180,6 +187,22 @@ class PlayerOptionsDelegate(val activity: FragmentActivity, val service: Playbac
hide()
service.playlistManager.toggleStats()
}
ID_SHOW_VIDEO_TIPS -> {
hide()
(activity as VideoPlayerActivity).tipsDelegate.init()
}
ID_SHOW_AUDIO_TIPS -> {
hide()
val audioPlayerContainerActivity = activity as AudioPlayerContainerActivity
val vsc = audioPlayerContainerActivity.findViewById<ViewStubCompat>(R.id.audio_player_tips)
audioPlayerContainerActivity.tipsDelegate.init(vsc)
}
ID_SHOW_PLAYLIST_TIPS -> {
hide()
val audioPlayerContainerActivity = activity as AudioPlayerContainerActivity
val vsc = audioPlayerContainerActivity.findViewById<ViewStubCompat>(R.id.audio_playlist_tips)
audioPlayerContainerActivity.playlistTipsDelegate.init(vsc)
}
ID_BOOKMARK -> {
hide()
bookmarkClickedListener.invoke()
......
......@@ -66,12 +66,15 @@ class VideoTipsDelegate(private val player: VideoPlayerActivity) : OnClickListen
* - Start the tips
*/
fun init() {
(player.findViewById<View>(R.id.player_overlay_tips) as ViewStubCompat).inflate()
(player.findViewById<View>(R.id.player_overlay_tips) as? ViewStubCompat)?.inflate()
player.tipsBrightnessProgress.setValue(50)
player.tipsVolumeProgress.setValue(50)
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(player.overlayTipsLayout)
if (!::initialConstraintSet.isInitialized) {
initialConstraintSet = ConstraintSet()
initialConstraintSet.clone(player.overlayTipsLayout)
}
player.overlayTipsLayout.setVisible()
next()
getTapIndicators().forEach { it.setOnClickListener(this) }
}
......@@ -181,6 +184,7 @@ class VideoTipsDelegate(private val player: VideoPlayerActivity) : OnClickListen
getTapIndicators().forEach { constraintSet.setVisibility(it.id, GONE) }
clearAllAnimations()
player.nextButton.setText(R.string.next)
when (currentTip) {
VideoPlayerTipsStep.CONTROLS -> {
......
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