From 2786d8abedd81d841e066769b6bfa2af64378ddd Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 23 May 2022 20:18:40 +0530 Subject: [PATCH] Changed Seekbar with Sliders --- .../activities/DriveModeActivity.kt | 25 +++--- .../retromusic/extensions/ColorExtensions.kt | 17 ++++- .../base/AbsPlayerControlsFragment.kt | 43 +++++------ .../fragments/other/VolumeFragment.kt | 32 ++++---- .../AdaptivePlaybackControlsFragment.kt | 4 +- .../blur/BlurPlaybackControlsFragment.kt | 4 +- .../card/CardPlaybackControlsFragment.kt | 12 +-- .../CardBlurPlaybackControlsFragment.kt | 4 +- .../player/circle/CirclePlayerFragment.kt | 65 ++++++++++------ .../player/classic/ClassicPlayerFragment.kt | 76 +++++++++++-------- .../color/ColorPlaybackControlsFragment.kt | 4 +- .../player/fit/FitPlaybackControlsFragment.kt | 17 ++++- .../flat/FlatPlaybackControlsFragment.kt | 4 +- .../full/FullPlaybackControlsFragment.kt | 4 +- .../player/gradient/GradientPlayerFragment.kt | 57 +++++++++----- .../lockscreen/LockScreenControlsFragment.kt | 4 +- .../material/MaterialControlsFragment.kt | 4 +- .../player/md3/MD3PlaybackControlsFragment.kt | 4 +- .../normal/PlayerPlaybackControlsFragment.kt | 4 +- .../player/peek/PeekPlayerControlFragment.kt | 4 +- .../plain/PlainPlaybackControlsFragment.kt | 4 +- .../fragments/search/SearchFragment.kt | 9 +-- .../service/MediaSessionCallback.kt | 2 +- .../monkey/retromusic/service/MusicService.kt | 11 ++- .../views/BottomNavigationBarTinted.kt | 7 +- app/src/main/res/drawable/ic_sleep_timer.xml | 2 +- .../res/layout-land/activity_drive_mode.xml | 8 +- .../layout-land/fragment_circle_player.xml | 6 +- .../main/res/layout/activity_drive_mode.xml | 11 +-- ...ment_adaptive_player_playback_controls.xml | 10 +-- ...fragment_blur_player_playback_controls.xml | 6 +- ...ent_card_blur_player_playback_controls.xml | 4 +- ...fragment_card_player_playback_controls.xml | 13 ++-- .../res/layout/fragment_circle_player.xml | 6 +- .../res/layout/fragment_classic_controls.xml | 11 ++- ...ragment_color_player_playback_controls.xml | 6 +- .../layout/fragment_fit_playback_controls.xml | 21 ++--- ...fragment_flat_player_playback_controls.xml | 9 +-- .../layout/fragment_full_player_controls.xml | 6 +- .../res/layout/fragment_gradient_controls.xml | 6 +- ...fragment_lock_screen_playback_controls.xml | 6 +- .../fragment_material_playback_controls.xml | 6 +- .../fragment_md3_player_playback_controls.xml | 4 +- .../layout/fragment_peek_control_player.xml | 6 +- .../fragment_plain_controls_fragment.xml | 6 +- app/src/main/res/layout/fragment_player.xml | 5 +- .../fragment_player_playback_controls.xml | 7 +- app/src/main/res/layout/fragment_volume.xml | 4 +- app/src/main/res/values/styles.xml | 6 ++ 49 files changed, 314 insertions(+), 282 deletions(-) diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt index 81f880ace..1fb04f469 100644 --- a/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/DriveModeActivity.kt @@ -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() diff --git a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt index cfd09a642..9d27c12bc 100644 --- a/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt +++ b/app/src/main/java/code/name/monkey/retromusic/extensions/ColorExtensions.kt @@ -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) \ No newline at end of file +inline val Int.colorStateList: ColorStateList + get() = ColorStateList.valueOf(this) + +fun @receiver:ColorInt Int.addAlpha(alpha: Float): Int { + return ColorUtil.withAlpha(this, alpha) +} \ No newline at end of file diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt index 4d3a63875..7228bf4b6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/base/AbsPlayerControlsFragment.kt @@ -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() } }) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt index 291ce2ebd..a8b10d297 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/other/VolumeFragment.kt @@ -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) { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt index d811b8e3a..a6d0bd5e6 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/adaptive/AdaptivePlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt index 3ade61087..5ad8ea9f1 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/blur/BlurPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt index 830a7c6f3..7095fcbfe 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/card/CardPlaybackControlsFragment.kt @@ -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() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt index 614bdc443..163d94864 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/cardblur/CardBlurPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt index 186f29ec3..ac61c3b22 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/circle/CirclePlayerFragment.kt @@ -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? = 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()) diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt index 99d7aad61..01bc4dd2e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/classic/ClassicPlayerFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt index 60c7d0a85..6a129366e 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/color/ColorPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt index f1256ddcb..006138c3c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/fit/FitPlaybackControlsFragment.kt @@ -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() { diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt index 845df16f8..5b21f5f07 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/flat/FlatPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt index a06c753ca..9bbe3bf7f 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/full/FullPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt index 6a1dddedf..048751906 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/gradient/GradientPlayerFragment.kt @@ -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 = diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt index d970908b5..75a188c2c 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/lockscreen/LockScreenControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt index dd19448b9..11c9d6275 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt index 8834ef119..cbb03e026 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/md3/MD3PlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt index 513160eea..1032f21db 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/normal/PlayerPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt index dd02d92ac..ffe19799d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/peek/PeekPlayerControlFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt index d76958040..b1643ca5d 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/plain/PlainPlaybackControlsFragment.kt @@ -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 diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt index eced42489..7a684f252 100644 --- a/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt +++ b/app/src/main/java/code/name/monkey/retromusic/fragments/search/SearchFragment.kt @@ -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 { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt index 685d533cc..609bbf937 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MediaSessionCallback.kt @@ -166,7 +166,7 @@ class MediaSessionCallback( override fun onSkipToPrevious() { super.onSkipToPrevious() - musicService.back(true) + musicService.playPreviousSong(true) } override fun onStop() { diff --git a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt index 25d37752f..54c5f35b0 100644 --- a/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt +++ b/app/src/main/java/code/name/monkey/retromusic/service/MusicService.kt @@ -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 { diff --git a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt index ada01196a..0e5ddb455 100644 --- a/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt +++ b/app/src/main/java/code/name/monkey/retromusic/views/BottomNavigationBarTinted.kt @@ -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) -} +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_sleep_timer.xml b/app/src/main/res/drawable/ic_sleep_timer.xml index e5ff2f862..62c546fc2 100644 --- a/app/src/main/res/drawable/ic_sleep_timer.xml +++ b/app/src/main/res/drawable/ic_sleep_timer.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/layout-land/activity_drive_mode.xml b/app/src/main/res/layout-land/activity_drive_mode.xml index decfc02b6..90f895cef 100644 --- a/app/src/main/res/layout-land/activity_drive_mode.xml +++ b/app/src/main/res/layout-land/activity_drive_mode.xml @@ -172,14 +172,12 @@ - \ No newline at end of file diff --git a/app/src/main/res/layout-land/fragment_circle_player.xml b/app/src/main/res/layout-land/fragment_circle_player.xml index f0b8e8151..ef1ceb2b9 100644 --- a/app/src/main/res/layout-land/fragment_circle_player.xml +++ b/app/src/main/res/layout-land/fragment_circle_player.xml @@ -178,11 +178,11 @@ app:layout_constraintTop_toBottomOf="@+id/titleContainer" tools:text="@tools:sample/lorem/random" /> - diff --git a/app/src/main/res/layout/activity_drive_mode.xml b/app/src/main/res/layout/activity_drive_mode.xml index 23849de05..0ef554144 100644 --- a/app/src/main/res/layout/activity_drive_mode.xml +++ b/app/src/main/res/layout/activity_drive_mode.xml @@ -177,17 +177,12 @@ tools:text="@tools:sample/lorem/random" /> - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml b/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml index c1bfa3b20..d758dbdca 100644 --- a/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_adaptive_player_playback_controls.xml @@ -4,8 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:orientation="vertical" - tools:ignore="MissingPrefix"> + android:orientation="vertical"> - @@ -45,7 +42,6 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - - + app:haloRadius="0dp" + app:trackHeight="20dp" + android:layout_weight="1"/> diff --git a/app/src/main/res/layout/fragment_circle_player.xml b/app/src/main/res/layout/fragment_circle_player.xml index 06561900a..702b26ca3 100644 --- a/app/src/main/res/layout/fragment_circle_player.xml +++ b/app/src/main/res/layout/fragment_circle_player.xml @@ -169,11 +169,11 @@ app:layout_constraintTop_toBottomOf="@+id/volumeSeekBar" /> - - + android:layout_toStartOf="@id/songTotalTime" + android:layout_toEndOf="@id/songCurrentProgress" /> diff --git a/app/src/main/res/layout/fragment_color_player_playback_controls.xml b/app/src/main/res/layout/fragment_color_player_playback_controls.xml index 207b52bf6..6118d2b6f 100644 --- a/app/src/main/res/layout/fragment_color_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_color_player_playback_controls.xml @@ -19,16 +19,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - + app:layout_constraintTop_toTopOf="parent" + app:trackHeight="@dimen/progress_container_height" /> @@ -165,7 +167,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="8dp" - android:background="?attr/roundSelector" app:layout_constraintBottom_toTopOf="@+id/volumeFragmentContainer" app:layout_constraintEnd_toStartOf="@+id/nextButton" app:layout_constraintHorizontal_bias="0.5" diff --git a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml index d75ebdf95..4066ba1da 100644 --- a/app/src/main/res/layout/fragment_flat_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_flat_player_playback_controls.xml @@ -19,16 +19,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_full_player_controls.xml b/app/src/main/res/layout/fragment_full_player_controls.xml index 7e3828311..f5b4f017e 100644 --- a/app/src/main/res/layout/fragment_full_player_controls.xml +++ b/app/src/main/res/layout/fragment_full_player_controls.xml @@ -90,16 +90,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_gradient_controls.xml b/app/src/main/res/layout/fragment_gradient_controls.xml index 59f4ff77e..422b93e38 100644 --- a/app/src/main/res/layout/fragment_gradient_controls.xml +++ b/app/src/main/res/layout/fragment_gradient_controls.xml @@ -93,15 +93,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - diff --git a/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml b/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml index f4808a1b2..377c55700 100644 --- a/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml +++ b/app/src/main/res/layout/fragment_lock_screen_playback_controls.xml @@ -21,16 +21,15 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - diff --git a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml index a1ac4c979..8785702fb 100644 --- a/app/src/main/res/layout/fragment_md3_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_md3_player_playback_controls.xml @@ -21,10 +21,9 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - - + app:layout_constraintTop_toBottomOf="@id/playbackControlsFragment" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_player_playback_controls.xml b/app/src/main/res/layout/fragment_player_playback_controls.xml index e06479a26..13194a9ab 100755 --- a/app/src/main/res/layout/fragment_player_playback_controls.xml +++ b/app/src/main/res/layout/fragment_player_playback_controls.xml @@ -19,16 +19,14 @@ app:layout_constraintBottom_toBottomOf="@+id/progressSlider" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="@id/progressSlider" - tools:ignore="RtlHardcoded,RtlSymmetry" tools:text="@tools:sample/date/hhmmss" /> - - 50% + +