package code.name.monkey.retromusic.fragments.player.fit import android.animation.ObjectAnimator import android.graphics.PorterDuff import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.view.animation.AccelerateInterpolator import android.view.animation.DecelerateInterpolator import android.view.animation.LinearInterpolator import android.widget.SeekBar 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.MaterialValueHelper import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.R 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.fragments.base.AbsPlayerControlsFragment 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 kotlinx.android.synthetic.main.fragment_fit_playback_controls.* class FitPlaybackControlsFragment : AbsPlayerControlsFragment() { private var lastPlaybackControlsColor: Int = 0 private var lastDisabledPlaybackControlsColor: Int = 0 private lateinit var progressViewUpdateHelper: MusicProgressViewUpdateHelper override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return inflater.inflate(R.layout.fragment_fit_playback_controls, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) setUpMusicControllers() title.isSelected = true text.isSelected = true playPauseButton.setOnClickListener { if (MusicPlayerRemote.isPlaying) { MusicPlayerRemote.pauseSong() } else { MusicPlayerRemote.resumePlaying() } showBonceAnimation() } } private fun updateSong() { val song = MusicPlayerRemote.currentSong title.text = song.title text.text = song.artistName if (PreferenceUtil.getInstance(requireContext()).isSongInfo) { songInfo.text = getSongInfo(song) songInfo.show() } else { songInfo.hide() } } override fun onResume() { super.onResume() progressViewUpdateHelper.start() } override fun onPause() { super.onPause() progressViewUpdateHelper.stop() } override fun onServiceConnected() { updatePlayPauseDrawableState() updateRepeatState() updateShuffleState() updateSong() } override fun onPlayingMetaChanged() { super.onPlayingMetaChanged() updateSong() } override fun onPlayStateChanged() { updatePlayPauseDrawableState() } override fun onRepeatModeChanged() { updateRepeatState() } override fun onShuffleModeChanged() { updateShuffleState() } override fun setDark(color: Int) { val colorBg = ATHUtil.resolveColor(activity, android.R.attr.colorBackground) if (ColorUtil.isColorLight(colorBg)) { lastPlaybackControlsColor = MaterialValueHelper.getSecondaryTextColor(activity, true) lastDisabledPlaybackControlsColor = MaterialValueHelper.getSecondaryDisabledTextColor(activity, true) } else { lastPlaybackControlsColor = MaterialValueHelper.getPrimaryTextColor(activity, false) lastDisabledPlaybackControlsColor = MaterialValueHelper.getPrimaryDisabledTextColor(activity, false) } val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) { color } else { ThemeStore.accentColor(requireContext()).ripAlpha() } volumeFragment?.setTintable(colorFinal) setFabColor(colorFinal) updateRepeatState() updateShuffleState() updatePrevNextColor() } private fun setFabColor(i: Int) { TintHelper.setTintAuto( playPauseButton, MaterialValueHelper.getPrimaryTextColor(context, ColorUtil.isColorLight(i)), false ) TintHelper.setTintAuto(playPauseButton, i, true) } private fun setUpPlayPauseFab() { playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) } private fun updatePlayPauseDrawableState() { if (MusicPlayerRemote.isPlaying) { playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp) } else { playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_32dp) } } private fun setUpMusicControllers() { setUpPlayPauseFab() setUpPrevNext() setUpRepeatButton() setUpShuffleButton() setUpProgressSlider() } private fun setUpPrevNext() { updatePrevNextColor() nextButton.setOnClickListener { MusicPlayerRemote.playNextSong() } previousButton.setOnClickListener { MusicPlayerRemote.back() } } private fun updatePrevNextColor() { nextButton!!.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) previousButton!!.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) } private fun setUpShuffleButton() { shuffleButton.setOnClickListener { MusicPlayerRemote.toggleShuffleMode() } } override fun updateShuffleState() { when (MusicPlayerRemote.shuffleMode) { MusicService.SHUFFLE_MODE_SHUFFLE -> shuffleButton.setColorFilter( lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN ) else -> shuffleButton.setColorFilter( lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN ) } } private fun setUpRepeatButton() { repeatButton.setOnClickListener { MusicPlayerRemote.cycleRepeatMode() } } override fun updateRepeatState() { when (MusicPlayerRemote.repeatMode) { MusicService.REPEAT_MODE_NONE -> { repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp) repeatButton.setColorFilter( lastDisabledPlaybackControlsColor, PorterDuff.Mode.SRC_IN ) } MusicService.REPEAT_MODE_ALL -> { repeatButton.setImageResource(R.drawable.ic_repeat_white_24dp) repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) } MusicService.REPEAT_MODE_THIS -> { repeatButton.setImageResource(R.drawable.ic_repeat_one_white_24dp) repeatButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN) } } } public override fun show() { playPauseButton!!.animate() .scaleX(1f) .scaleY(1f) .rotation(360f) .setInterpolator(DecelerateInterpolator()) .start() } public override fun hide() { if (playPauseButton != null) { playPauseButton!!.apply { scaleX = 0f scaleY = 0f rotation = 0f } } } override fun setUpProgressSlider() { progressSlider.setOnSeekBarChangeListener(object : SimpleOnSeekbarChangeListener() { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { if (fromUser) { MusicPlayerRemote.seekTo(progress) onUpdateProgressViews( MusicPlayerRemote.songProgressMillis, MusicPlayerRemote.songDurationMillis ) } } }) } private fun showBonceAnimation() { playPauseButton.apply { clearAnimation() scaleX = 0.9f scaleY = 0.9f visibility = View.VISIBLE pivotX = (width / 2).toFloat() pivotY = (height / 2).toFloat() animate().setDuration(200) .setInterpolator(DecelerateInterpolator()) .scaleX(1.1f) .scaleY(1.1f) .withEndAction { animate().setDuration(200) .setInterpolator(AccelerateInterpolator()) .scaleX(1f) .scaleY(1f) .alpha(1f).start() }.start() } } override fun onUpdateProgressViews(progress: Int, total: Int) { progressSlider.max = total val animator = ObjectAnimator.ofInt(progressSlider, "progress", progress) animator.duration = SLIDER_ANIMATION_TIME animator.interpolator = LinearInterpolator() animator.start() songTotalTime.text = MusicUtil.getReadableDurationString(total.toLong()) songCurrentProgress.text = MusicUtil.getReadableDurationString(progress.toLong()) } }