[Now Playing: Circle] Added Circular rotating album cover to Circle theme

This commit is contained in:
Prathamesh More 2021-12-14 19:34:26 +05:30
parent 222e39d0ea
commit 87eb3c08c3
3 changed files with 79 additions and 11 deletions

View file

@ -23,6 +23,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.Animation
import android.view.animation.LinearInterpolator import android.view.animation.LinearInterpolator
import android.widget.SeekBar import android.widget.SeekBar
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
@ -38,6 +39,8 @@ import code.name.monkey.retromusic.fragments.base.AbsPlayerControlsFragment
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.base.goToAlbum import code.name.monkey.retromusic.fragments.base.goToAlbum
import code.name.monkey.retromusic.fragments.base.goToArtist import code.name.monkey.retromusic.fragments.base.goToArtist
import code.name.monkey.retromusic.glide.GlideApp
import code.name.monkey.retromusic.glide.RetroGlideExtension
import code.name.monkey.retromusic.helper.MusicPlayerRemote import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper
import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback import code.name.monkey.retromusic.helper.MusicProgressViewUpdateHelper.Callback
@ -69,6 +72,8 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
private var _binding: FragmentCirclePlayerBinding? = null private var _binding: FragmentCirclePlayerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private var rotateAnimator: ObjectAnimator? = null
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
progressViewUpdateHelper = MusicProgressViewUpdateHelper(this) progressViewUpdateHelper = MusicProgressViewUpdateHelper(this)
@ -144,6 +149,17 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler()) binding.playPauseButton.setOnClickListener(PlayPauseButtonOnClickHandler())
} }
private fun setupRotateAnimation() {
rotateAnimator = ObjectAnimator.ofFloat(binding.albumCover, View.ROTATION, 360F).apply {
interpolator = LinearInterpolator()
repeatCount = Animation.INFINITE
duration = 10000
if (MusicPlayerRemote.isPlaying){
start()
}
}
}
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
progressViewUpdateHelper.start() progressViewUpdateHelper.start()
@ -153,10 +169,8 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this) audioVolumeObserver?.register(AudioManager.STREAM_MUSIC, this)
val audioManager = audioManager val audioManager = audioManager
if (audioManager != null) { binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)
binding.volumeSeekBar.max = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC) binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
binding.volumeSeekBar.progress = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)
}
binding.volumeSeekBar.setOnSeekArcChangeListener(this) binding.volumeSeekBar.setOnSeekArcChangeListener(this)
} }
@ -191,6 +205,11 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
override fun onPlayStateChanged() { override fun onPlayStateChanged() {
updatePlayPauseDrawableState() updatePlayPauseDrawableState()
if (MusicPlayerRemote.isPlaying) {
if (rotateAnimator?.isStarted == true) rotateAnimator?.resume() else rotateAnimator?.start()
} else {
rotateAnimator?.pause()
}
} }
override fun onPlayingMetaChanged() { override fun onPlayingMetaChanged() {
@ -202,6 +221,7 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
super.onServiceConnected() super.onServiceConnected()
updateSong() updateSong()
updatePlayPauseDrawableState() updatePlayPauseDrawableState()
setupRotateAnimation()
} }
private fun updateSong() { private fun updateSong() {
@ -215,6 +235,10 @@ class CirclePlayerFragment : AbsPlayerFragment(R.layout.fragment_circle_player),
} else { } else {
binding.songInfo.hide() binding.songInfo.hide()
} }
GlideApp.with(this)
.load(RetroGlideExtension.getSongModel(song))
.songCoverOptions(song)
.into(binding.albumCover)
} }
private fun updatePlayPauseDrawableState() { private fun updatePlayPauseDrawableState() {

View file

@ -54,6 +54,31 @@
app:navigationIcon="@drawable/ic_keyboard_arrow_down_black" app:navigationIcon="@drawable/ic_keyboard_arrow_down_black"
tools:layout_editor_absoluteY="24dp" /> tools:layout_editor_absoluteY="24dp" />
<code.name.monkey.retromusic.views.RetroShapeableImageView
android:id="@+id/album_cover"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="28dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="@id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/playerToolbar"
tools:srcCompat="@tools:sample/backgrounds/scenic[6]" />
<code.name.monkey.retromusic.views.RetroShapeableImageView
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_margin="28dp"
android:alpha="0.5"
android:background="?colorSurface"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="@id/guideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/playerToolbar" />
<code.name.monkey.retromusic.views.SeekArc <code.name.monkey.retromusic.views.SeekArc
android:id="@+id/volumeSeekBar" android:id="@+id/volumeSeekBar"

View file

@ -17,15 +17,11 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="?colorSurface"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:orientation="vertical"> android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/colorSurface" />
<FrameLayout <FrameLayout
android:id="@+id/statusBarContainer" android:id="@+id/statusBarContainer"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -85,6 +81,28 @@
app:layout_constraintTop_toBottomOf="@+id/titleContainer" app:layout_constraintTop_toBottomOf="@+id/titleContainer"
tools:text="@tools:sample/lorem/random" /> tools:text="@tools:sample/lorem/random" />
<code.name.monkey.retromusic.views.RetroShapeableImageView
android:id="@+id/album_cover"
android:layout_width="276dp"
android:layout_height="276dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:srcCompat="@tools:sample/backgrounds/scenic[6]" />
<code.name.monkey.retromusic.views.RetroShapeableImageView
android:layout_width="276dp"
android:layout_height="276dp"
android:alpha="0.5"
android:background="?colorSurface"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<code.name.monkey.retromusic.views.SeekArc <code.name.monkey.retromusic.views.SeekArc
android:id="@+id/volumeSeekBar" android:id="@+id/volumeSeekBar"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -139,14 +157,15 @@
app:tint="@color/md_green_500" /> app:tint="@color/md_green_500" />
<com.google.android.material.textview.MaterialTextView <com.google.android.material.textview.MaterialTextView
android:id="@+id/materialTextView3"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/volume" android:text="@string/volume"
android:textAppearance="@style/TextViewSubtitle2" android:textAppearance="@style/TextViewSubtitle2"
android:textColor="?android:attr/textColorSecondary" android:textColor="?android:attr/textColorSecondary"
app:layout_constraintBottom_toBottomOf="@+id/volumeSeekBar"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/volumeSeekBar" /> app:layout_constraintStart_toStartOf="@+id/volumeSeekBar"
app:layout_constraintTop_toBottomOf="@+id/album_cover" />
<androidx.appcompat.widget.AppCompatSeekBar <androidx.appcompat.widget.AppCompatSeekBar