Changed Seekbar with Sliders

This commit is contained in:
Prathamesh More 2022-05-23 20:18:40 +05:30
parent b9f0adc9c2
commit 2786d8abed
49 changed files with 314 additions and 282 deletions

View file

@ -20,7 +20,6 @@ import android.graphics.Color
import android.graphics.PorterDuff
import android.os.Bundle
import android.view.animation.LinearInterpolator
import android.widget.SeekBar
import androidx.lifecycle.lifecycleScope
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.activities.base.AbsMusicServiceActivity
@ -36,11 +35,11 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.repository.RealRepository
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import com.google.android.material.slider.Slider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@ -113,17 +112,15 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
}
private fun setUpProgressSlider() {
binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
MusicPlayerRemote.seekTo(progress)
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
binding.progressSlider.addOnChangeListener { _: Slider, progress: Float, fromUser: Boolean ->
if (fromUser) {
MusicPlayerRemote.seekTo(progress.toInt())
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
})
}
}
override fun onPause() {
@ -249,9 +246,9 @@ class DriveModeActivity : AbsMusicServiceActivity(), Callback {
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.progressSlider.max = total
binding.progressSlider.valueTo = total.toFloat()
val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress)
val animator = ObjectAnimator.ofFloat(binding.progressSlider, "value", progress.toFloat())
animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
animator.interpolator = LinearInterpolator()
animator.start()

View file

@ -163,6 +163,15 @@ fun SeekBar.applyColor(@ColorInt color: Int) {
progressBackgroundTintList = ColorStateList.valueOf(color)
}
fun Slider.applyColor(@ColorInt color: Int) {
ColorStateList.valueOf(color).run {
thumbTintList = this
trackActiveTintList = this
trackInactiveTintList = ColorStateList.valueOf(color.addAlpha(0.1f))
haloTintList = this
}
}
fun ExtendedFloatingActionButton.accentColor() {
if (materialYou) return
val color = ThemeStore.accentColor(context)
@ -301,5 +310,9 @@ inline val @receiver:ColorInt Int.lighterColor
inline val @receiver:ColorInt Int.darkerColor
get() = ColorUtil.darkenColor(this)
inline val Int.colorStateList : ColorStateList
get() = ColorStateList.valueOf(this)
inline val Int.colorStateList: ColorStateList
get() = ColorStateList.valueOf(this)
fun @receiver:ColorInt Int.addAlpha(alpha: Float): Int {
return ColorUtil.withAlpha(this, alpha)
}

View file

@ -23,7 +23,6 @@ import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import android.view.animation.LinearInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
import androidx.annotation.LayoutRes
import androidx.core.view.isVisible
@ -35,11 +34,11 @@ import code.name.monkey.retromusic.fragments.MusicSeekSkipTouchListener
import code.name.monkey.retromusic.fragments.other.VolumeFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.slider.Slider
/**
* Created by hemanths on 24/09/17.
@ -61,7 +60,7 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
var isSeeking = false
private set
open val progressSlider: SeekBar? = null
open val progressSlider: Slider? = null
abstract val shuffleButton: ImageButton
@ -78,16 +77,17 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
private var progressAnimator: ObjectAnimator? = null
override fun onUpdateProgressViews(progress: Int, total: Int) {
progressSlider?.max = total
progressSlider?.valueTo = total.toFloat()
if (isSeeking) {
progressSlider?.progress = progress
progressSlider?.value = progress.toFloat()
} else {
progressAnimator = ObjectAnimator.ofInt(progressSlider, "progress", progress).apply {
duration = SLIDER_ANIMATION_TIME
interpolator = LinearInterpolator()
start()
}
progressAnimator =
ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply {
duration = SLIDER_ANIMATION_TIME
interpolator = LinearInterpolator()
start()
}
}
songTotalTime?.text = MusicUtil.getReadableDurationString(total.toLong())
@ -95,25 +95,24 @@ abstract class AbsPlayerControlsFragment(@LayoutRes layout: Int) : AbsMusicServi
}
private fun setUpProgressSlider() {
progressSlider?.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
onUpdateProgressViews(
progress,
MusicPlayerRemote.songDurationMillis
)
}
progressSlider?.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
if (fromUser) {
onUpdateProgressViews(
value.toInt(),
MusicPlayerRemote.songDurationMillis
)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
})
progressSlider?.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
isSeeking = true
progressViewUpdateHelper.stop()
progressAnimator?.cancel()
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
override fun onStopTrackingTouch(slider: Slider) {
isSeeking = false
MusicPlayerRemote.seekTo(seekBar.progress)
MusicPlayerRemote.seekTo(slider.value.toInt())
progressViewUpdateHelper.start()
}
})

View file

@ -21,7 +21,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SeekBar
import androidx.core.content.getSystemService
import androidx.fragment.app.Fragment
import code.name.monkey.appthemehelper.ThemeStore
@ -32,8 +31,9 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.volume.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
import com.google.android.material.slider.Slider
class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolumeChangedListener,
class VolumeFragment : Fragment(), Slider.OnChangeListener, OnAudioVolumeChangedListener,
View.OnClickListener {
private var _binding: FragmentVolumeBinding? = null
@ -47,7 +47,7 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
savedInstanceState: Bundle?,
): View {
_binding = FragmentVolumeBinding.inflate(inflater, container, false)
return binding.root
@ -68,15 +68,17 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this)
val audioManager = audioManager
binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
binding.volumeSeekBar.setOnSeekBarChangeListener(this)
binding.volumeSeekBar.valueTo =
audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat()
binding.volumeSeekBar.value =
audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat()
binding.volumeSeekBar.addOnChangeListener(this)
}
override fun onAudioVolumeChanged(currentVolume: Int, maxVolume: Int) {
if (_binding != null) {
binding.volumeSeekBar.max = maxVolume
binding.volumeSeekBar.progress = currentVolume
binding.volumeSeekBar.valueTo = maxVolume.toFloat()
binding.volumeSeekBar.value = currentVolume.toFloat()
binding.volumeDown.setImageResource(if (currentVolume == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
}
}
@ -87,17 +89,11 @@ class VolumeFragment : Fragment(), SeekBar.OnSeekBarChangeListener, OnAudioVolum
_binding = null
}
override fun onProgressChanged(seekBar: SeekBar, i: Int, b: Boolean) {
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
val audioManager = audioManager
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, i, 0)
setPauseWhenZeroVolume(i < 1)
binding.volumeDown.setImageResource(if (i == 0) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
}
override fun onStartTrackingTouch(seekBar: SeekBar) {
}
override fun onStopTrackingTouch(seekBar: SeekBar) {
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, value.toInt(), 0)
setPauseWhenZeroVolume(value < 1f)
binding.volumeDown.setImageResource(if (value == 0f) R.drawable.ic_volume_off else R.drawable.ic_volume_down)
}
override fun onClick(view: View) {

View file

@ -17,7 +17,7 @@ package code.name.monkey.retromusic.fragments.player.adaptive
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -38,7 +38,7 @@ class AdaptivePlaybackControlsFragment :
private var _binding: FragmentAdaptivePlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -19,7 +19,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.util.ColorUtil
@ -43,7 +43,7 @@ class BlurPlaybackControlsFragment :
private var _binding: FragmentBlurPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -18,7 +18,7 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -27,10 +27,7 @@ import code.name.monkey.appthemehelper.util.MaterialValueHelper
import code.name.monkey.appthemehelper.util.TintHelper
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.FragmentCardPlayerPlaybackControlsBinding
import code.name.monkey.retromusic.extensions.getSongInfo
import code.name.monkey.retromusic.extensions.hide
import code.name.monkey.retromusic.extensions.ripAlpha
import code.name.monkey.retromusic.extensions.show
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist
@ -45,7 +42,7 @@ class CardPlaybackControlsFragment :
private var _binding: FragmentCardPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@ -78,6 +75,9 @@ class CardPlaybackControlsFragment :
binding.text.setOnClickListener {
goToArtist(requireActivity())
}
binding.progressSlider.apply {
setCustomThumbDrawable(R.drawable.switch_square)
}
}
private fun updateSong() {

View file

@ -19,7 +19,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper
@ -41,7 +41,7 @@ class CardBlurPlaybackControlsFragment :
private var _binding: FragmentCardBlurPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -25,7 +25,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.Animation
import android.view.animation.LinearInterpolator
import android.widget.SeekBar
import androidx.appcompat.widget.Toolbar
import androidx.core.content.getSystemService
import code.name.monkey.appthemehelper.ThemeStore
@ -49,13 +48,13 @@ import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import code.name.monkey.retromusic.volume.AudioVolumeObserver
import code.name.monkey.retromusic.volume.OnAudioVolumeChangedListener
import com.google.android.material.slider.Slider
import me.tankery.lib.circularseekbar.CircularSeekBar
/**
@ -78,6 +77,9 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private var rotateAnimator: ObjectAnimator? = null
private var lastRequest: GlideRequest<Drawable>? = null
private var progressAnimator: ObjectAnimator? = null
var isSeeking = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
@ -113,11 +115,6 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setupViews() {
setUpProgressSlider()
ViewUtil.setProgressDrawable(
binding.progressSlider,
ThemeStore.accentColor(requireContext()),
false
)
binding.volumeSeekBar.circleProgressColor = accentColor()
binding.volumeSeekBar.circleColor = ColorUtil.withAlpha(accentColor(), 0.25f)
setUpPlayPauseFab()
@ -135,7 +132,8 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setUpPrevNext() {
updatePrevNextColor()
binding.nextButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), true))
binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(), false))
binding.previousButton.setOnTouchListener(MusicSeekSkipTouchListener(requireActivity(),
false))
}
private fun updatePrevNextColor() {
@ -275,7 +273,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
}
override fun onProgressChanged(circularSeekBar: CircularSeekBar?, progress: Float, fromUser: Boolean) {
override fun onProgressChanged(
circularSeekBar: CircularSeekBar?,
progress: Float,
fromUser: Boolean,
) {
val audioManager = audioManager
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress.toInt(), 0)
}
@ -288,26 +290,43 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private fun setUpProgressSlider() {
binding.progressSlider.applyColor(accentColor())
binding.progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
MusicPlayerRemote.seekTo(progress)
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
val progressSlider = binding.progressSlider
progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
if (fromUser) {
onUpdateProgressViews(
value.toInt(),
MusicPlayerRemote.songDurationMillis
)
}
})
progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
isSeeking = true
progressViewUpdateHelper.stop()
}
override fun onStopTrackingTouch(slider: Slider) {
isSeeking = false
MusicPlayerRemote.seekTo(slider.value.toInt())
progressViewUpdateHelper.start()
}
})
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.progressSlider.max = total
val progressSlider = binding.progressSlider
progressSlider.valueTo = total.toFloat()
val animator = ObjectAnimator.ofInt(binding.progressSlider, "progress", progress)
animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
animator.interpolator = LinearInterpolator()
animator.start()
if (isSeeking) {
progressSlider.value = progress.toFloat()
} else {
progressAnimator =
ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply {
duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
interpolator = LinearInterpolator()
start()
}
}
binding.songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong())
binding.songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong())

View file

@ -22,7 +22,6 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.commit
@ -45,18 +44,17 @@ import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ViewUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.from
import com.google.android.material.card.MaterialCardView
import com.google.android.material.shape.MaterialShapeDrawable
import com.google.android.material.shape.ShapeAppearanceModel
import com.google.android.material.slider.Slider
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager
@ -83,9 +81,12 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
private var playingQueueAdapter: PlayingQueueAdapter? = null
private lateinit var linearLayoutManager: LinearLayoutManager
private var progressAnimator: ObjectAnimator? = null
var isSeeking = false
private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() {
override fun onSlide(bottomSheet: View, slideOffset: Float) {
mainActivity.getBottomSheetBehavior().isDraggable = false
mainActivity.getBottomSheetBehavior().isDraggable = false
binding.playerQueueSheet.setContentPadding(
binding.playerQueueSheet.contentPaddingLeft,
(slideOffset * binding.statusBar.height).toInt(),
@ -99,7 +100,8 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
BottomSheetBehavior.STATE_EXPANDED,
BottomSheetBehavior.STATE_DRAGGING -> {
BottomSheetBehavior.STATE_DRAGGING,
-> {
mainActivity.getBottomSheetBehavior().isDraggable = false
}
BottomSheetBehavior.STATE_COLLAPSED -> {
@ -161,6 +163,10 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
binding.text.setOnClickListener {
goToArtist(requireActivity())
}
binding.playerControlsContainer.progressSlider.apply {
setCustomThumbDrawable(R.drawable.switch_square)
}
}
private fun hideVolumeIfAvailable() {
@ -286,11 +292,8 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
binding.playerControlsContainer.songCurrentProgress.setTextColor(lastPlaybackControlsColor)
binding.playerControlsContainer.songTotalTime.setTextColor(lastPlaybackControlsColor)
ViewUtil.setProgressDrawable(
binding.playerControlsContainer.progressSlider,
color.primaryTextColor,
true
)
binding.playerControlsContainer.progressSlider.applyColor(color.primaryTextColor)
volumeFragment?.setTintableColor(color.primaryTextColor)
TintHelper.setTintAuto(
@ -327,16 +330,20 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.playerControlsContainer.progressSlider.max = total
val progressSlider = binding.playerControlsContainer.progressSlider
progressSlider.valueTo = total.toFloat()
val animator = ObjectAnimator.ofInt(
binding.playerControlsContainer.progressSlider,
"progress",
progress
)
animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
animator.interpolator = LinearInterpolator()
animator.start()
if (isSeeking) {
progressSlider.value = progress.toFloat()
} else {
progressAnimator =
ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply {
duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
interpolator = LinearInterpolator()
start()
}
}
binding.playerControlsContainer.songTotalTime.text =
MusicUtil.getReadableDurationString(total.toLong())
@ -416,16 +423,25 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
}
private fun setUpProgressSlider() {
binding.playerControlsContainer.progressSlider.setOnSeekBarChangeListener(object :
SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
MusicPlayerRemote.seekTo(progress)
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
val progressSlider = binding.playerControlsContainer.progressSlider
progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
if (fromUser) {
onUpdateProgressViews(
value.toInt(),
MusicPlayerRemote.songDurationMillis
)
}
})
progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
isSeeking = true
progressViewUpdateHelper.stop()
}
override fun onStopTrackingTouch(slider: Slider) {
isSeeking = false
MusicPlayerRemote.seekTo(slider.value.toInt())
progressViewUpdateHelper.start()
}
})
}
@ -537,7 +553,7 @@ class ClassicPlayerFragment : AbsPlayerFragment(R.layout.fragment_classic_player
oldLeft: Int,
oldTop: Int,
oldRight: Int,
oldBottom: Int
oldBottom: Int,
) {
val height = binding.playerContainer.height
val width = binding.playerContainer.width

View file

@ -22,7 +22,7 @@ import android.view.ViewAnimationUtils
import android.view.animation.AccelerateInterpolator
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.TintHelper
@ -46,7 +46,7 @@ class ColorPlaybackControlsFragment :
private var _binding: FragmentColorPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -18,7 +18,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ColorUtil
@ -33,6 +32,8 @@ import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.slider.Slider
import java.lang.reflect.Field
class FitPlaybackControlsFragment :
AbsPlayerControlsFragment(R.layout.fragment_fit_playback_controls) {
@ -40,7 +41,7 @@ class FitPlaybackControlsFragment :
private var _binding: FragmentFitPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton
@ -75,6 +76,18 @@ class FitPlaybackControlsFragment :
binding.text.setOnClickListener {
goToArtist(requireActivity())
}
binding.progressSlider.apply {
setCustomThumbDrawable(R.drawable.switch_square)
}
val field: Field = Slider::class.java.superclass.getDeclaredField("trackSidePadding")
field.isAccessible = true
field.set(binding.progressSlider, 0)
binding.progressSlider.invalidate()
}
private fun updateSong() {

View file

@ -18,7 +18,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -43,7 +43,7 @@ class FlatPlaybackControlsFragment :
private var _binding: FragmentFlatPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -23,7 +23,7 @@ import android.view.MenuItem
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import androidx.appcompat.widget.PopupMenu
import androidx.lifecycle.lifecycleScope
@ -62,7 +62,7 @@ class FullPlaybackControlsFragment :
private var _binding: FragmentFullPlayerControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -23,7 +23,6 @@ import android.graphics.drawable.AnimatedVectorDrawable
import android.os.Bundle
import android.view.View
import android.view.animation.LinearInterpolator
import android.widget.SeekBar
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.Toolbar
@ -50,13 +49,13 @@ import code.name.monkey.retromusic.fragments.other.VolumeFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.PlayPauseButtonOnClickHandler
import code.name.monkey.retromusic.misc.SimpleOnSeekbarChangeListener
import code.name.monkey.retromusic.service.MusicService
import code.name.monkey.retromusic.util.MusicUtil
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
import com.google.android.material.slider.Slider
import com.h6ah4i.android.widget.advrecyclerview.animator.DraggableItemAnimator
import com.h6ah4i.android.widget.advrecyclerview.draggable.RecyclerViewDragDropManager
import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager
@ -85,6 +84,9 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
private var _binding: FragmentGradientPlayerBinding? = null
private val binding get() = _binding!!
private var progressAnimator: ObjectAnimator? = null
var isSeeking = false
private val bottomSheetCallbackList = object : BottomSheetCallback() {
override fun onSlide(bottomSheet: View, slideOffset: Float) {
mainActivity.getBottomSheetBehavior().isDraggable = false
@ -544,30 +546,43 @@ class GradientPlayerFragment : AbsPlayerFragment(R.layout.fragment_gradient_play
}
private fun setUpProgressSlider() {
binding.playbackControlsFragment.progressSlider.setOnSeekBarChangeListener(object :
SimpleOnSeekbarChangeListener() {
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
MusicPlayerRemote.seekTo(progress)
onUpdateProgressViews(
MusicPlayerRemote.songProgressMillis,
MusicPlayerRemote.songDurationMillis
)
}
val progressSlider = binding.playbackControlsFragment.progressSlider
progressSlider.addOnChangeListener(Slider.OnChangeListener { _, value, fromUser ->
if (fromUser) {
onUpdateProgressViews(
value.toInt(),
MusicPlayerRemote.songDurationMillis
)
}
})
progressSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
override fun onStartTrackingTouch(slider: Slider) {
isSeeking = true
progressViewUpdateHelper.stop()
}
override fun onStopTrackingTouch(slider: Slider) {
isSeeking = false
MusicPlayerRemote.seekTo(slider.value.toInt())
progressViewUpdateHelper.start()
}
})
}
override fun onUpdateProgressViews(progress: Int, total: Int) {
binding.playbackControlsFragment.progressSlider.max = total
val animator = ObjectAnimator.ofInt(
binding.playbackControlsFragment.progressSlider,
"progress",
progress
)
animator.duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
animator.interpolator = LinearInterpolator()
animator.start()
val progressSlider = binding.playbackControlsFragment.progressSlider
progressSlider.valueTo = total.toFloat()
if (isSeeking) {
progressSlider.value = progress.toFloat()
} else {
progressAnimator =
ObjectAnimator.ofFloat(progressSlider, "value", progress.toFloat()).apply {
duration = AbsPlayerControlsFragment.SLIDER_ANIMATION_TIME
interpolator = LinearInterpolator()
start()
}
}
binding.playbackControlsFragment.songTotalTime.text =
MusicUtil.getReadableDurationString(total.toLong())
binding.playbackControlsFragment.songCurrentProgress.text =

View file

@ -18,7 +18,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
@ -44,7 +44,7 @@ class LockScreenControlsFragment :
private var _binding: FragmentLockScreenPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -18,7 +18,7 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import androidx.core.content.ContextCompat
import code.name.monkey.appthemehelper.util.ATHUtil
@ -44,7 +44,7 @@ class MaterialControlsFragment :
private var _binding: FragmentMaterialPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -17,7 +17,7 @@ package code.name.monkey.retromusic.fragments.player.md3
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
@ -40,7 +40,7 @@ class MD3PlaybackControlsFragment :
private var _binding: FragmentMd3PlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -18,7 +18,7 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -41,7 +41,7 @@ class PlayerPlaybackControlsFragment :
private var _binding: FragmentPlayerPlaybackControlsBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -19,7 +19,7 @@ import android.graphics.PorterDuff
import android.os.Bundle
import android.view.View
import android.widget.ImageButton
import android.widget.SeekBar
import com.google.android.material.slider.Slider
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -43,7 +43,7 @@ class PeekPlayerControlFragment : AbsPlayerControlsFragment(R.layout.fragment_pe
private var _binding: FragmentPeekControlPlayerBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -18,7 +18,6 @@ import android.os.Bundle
import android.view.View
import android.view.animation.DecelerateInterpolator
import android.widget.ImageButton
import android.widget.SeekBar
import android.widget.TextView
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
@ -35,6 +34,7 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
import com.google.android.material.slider.Slider
/**
* @author Hemanth S (h4h13).
@ -46,7 +46,7 @@ class PlainPlaybackControlsFragment :
private var _binding: FragmentPlainControlsFragmentBinding? = null
private val binding get() = _binding!!
override val progressSlider: SeekBar
override val progressSlider: Slider
get() = binding.progressSlider
override val shuffleButton: ImageButton

View file

@ -29,17 +29,12 @@ import androidx.core.widget.doAfterTextChanged
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.transition.TransitionManager
import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.adapter.SearchAdapter
import code.name.monkey.retromusic.databinding.FragmentSearchBinding
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.extensions.focusAndShowKeyboard
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.views.addAlpha
import com.google.android.material.chip.Chip
import com.google.android.material.chip.ChipGroup
import com.google.android.material.shape.MaterialShapeDrawable
@ -133,7 +128,7 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
val colors = intArrayOf(
android.R.color.transparent,
ThemeStore.accentColor(requireContext()).addAlpha(0.5F)
accentColor().addAlpha(0.5F)
)
chips.forEach {

View file

@ -166,7 +166,7 @@ class MediaSessionCallback(
override fun onSkipToPrevious() {
super.onSkipToPrevious()
musicService.back(true)
musicService.playPreviousSong(true)
}
override fun onStop() {

View file

@ -204,8 +204,14 @@ class MusicService : MediaBrowserServiceCompat(),
private val updateFavoriteReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
isCurrentFavorite { isFavorite ->
playingNotification?.updateFavorite(isFavorite)
startForegroundOrNotify()
if (!isForeground) {
playingNotification?.updateMetadata(currentSong) {
playingNotification?.setPlaying(isPlaying)
playingNotification?.updateFavorite(isFavorite)
startForegroundOrNotify()
}
}
appWidgetCircle.notifyChange(this@MusicService, FAVORITE_STATE_CHANGED)
}
}
@ -676,6 +682,7 @@ class MusicService : MediaBrowserServiceCompat(),
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
startForegroundOrNotify()
if (intent != null && intent.action != null) {
handleIntent(mediaSession, intent)
serviceScope.launch {

View file

@ -21,6 +21,7 @@ import code.name.monkey.appthemehelper.ThemeStore
import code.name.monkey.appthemehelper.util.ATHUtil
import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.NavigationViewUtil
import code.name.monkey.retromusic.extensions.addAlpha
import code.name.monkey.retromusic.util.PreferenceUtil
import com.google.android.material.bottomnavigation.BottomNavigationView
import dev.chrisbanes.insetter.applyInsetter
@ -69,8 +70,4 @@ class BottomNavigationBarTinted @JvmOverloads constructor(
}
}
}
}
fun Int.addAlpha(alpha: Float): Int {
return ColorUtil.withAlpha(this, alpha)
}
}