diff --git a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
index 92124757f..3efebdc9b 100644
--- a/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/adapter/album/AlbumCoverPagerAdapter.kt
@@ -109,6 +109,7 @@ class AlbumCoverPagerAdapter(
NowPlayingScreen.FIT,
NowPlayingScreen.TINY,
NowPlayingScreen.CLASSIC,
+ NowPlayingScreen.MATERIAL,
NowPlayingScreen.FULL -> R.layout.fragment_album_full_cover
else -> {
if (PreferenceUtil.getInstance(requireContext())
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 0ac2d8c80..0290fb42f 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
@@ -62,11 +62,9 @@ abstract class AbsPlayerControlsFragment : AbsMusicServiceFragment(),
private fun hideVolumeIfAvailable() {
if (PreferenceUtil.getInstance(requireContext()).volumeToggle) {
- childFragmentManager.beginTransaction()
- .replace(R.id.volumeFragmentContainer, VolumeFragment()).commit()
+ childFragmentManager.beginTransaction().replace(R.id.volumeFragmentContainer, VolumeFragment()).commit()
childFragmentManager.executePendingTransactions()
- volumeFragment =
- childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment?
+ volumeFragment = childFragmentManager.findFragmentById(R.id.volumeFragmentContainer) as VolumeFragment?
}
}
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 d1e50d3dc..b3ea9c35a 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
@@ -117,6 +117,11 @@ class ClassicPlayerFragment : AbsPlayerFragment(), View.OnLayoutChangeListener,
}
}
+ override fun onDestroyView() {
+ super.onDestroyView()
+ getQueuePanel().removeBottomSheetCallback(bottomSheetCallbackList)
+ }
+
private fun updateSong() {
val song = MusicPlayerRemote.currentSong
title.text = song.title
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 bdbff3612..a2ec97f23 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
@@ -6,7 +6,6 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
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.retromusic.R
import code.name.monkey.retromusic.extensions.hide
@@ -99,24 +98,22 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() {
}
override fun setDark(color: Int) {
- val colorBg = ATHUtil.resolveColor(requireContext(), R.attr.colorSurface)
- if (ColorUtil.isColorLight(colorBg)) {
- lastPlaybackControlsColor =
- MaterialValueHelper.getSecondaryTextColor(requireContext(), true)
- lastDisabledPlaybackControlsColor =
- MaterialValueHelper.getSecondaryDisabledTextColor(requireContext(), true)
- } else {
+ if (ATHUtil.isWindowBackgroundDark(requireContext())) {
lastPlaybackControlsColor =
MaterialValueHelper.getPrimaryTextColor(requireContext(), false)
lastDisabledPlaybackControlsColor =
MaterialValueHelper.getPrimaryDisabledTextColor(requireContext(), false)
+ }else{
+ lastPlaybackControlsColor =
+ MaterialValueHelper.getSecondaryTextColor(requireContext(), true)
+ lastDisabledPlaybackControlsColor =
+ MaterialValueHelper.getSecondaryDisabledTextColor(requireContext(), true)
}
-
updateRepeatState()
updateShuffleState()
val colorFinal = if (PreferenceUtil.getInstance(requireContext()).adaptiveColor) {
- color
+ lastPlaybackControlsColor
} else {
textColorSecondary(requireContext())
}.ripAlpha()
@@ -126,12 +123,14 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() {
volumeFragment?.setTintable(colorFinal)
- updatePlayPauseColor(colorFinal)
- updatePrevNextColor(colorFinal)
+ updateRepeatState()
+ updateShuffleState()
+ updatePlayPauseColor()
+ updatePrevNextColor()
}
- private fun updatePlayPauseColor(color: Int) {
- playPauseButton.setColorFilter(color, PorterDuff.Mode.SRC_IN)
+ private fun updatePlayPauseColor() {
+ playPauseButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN)
}
private fun setUpPlayPauseFab() {
@@ -155,14 +154,14 @@ class MaterialControlsFragment : AbsPlayerControlsFragment() {
}
private fun setUpPrevNext() {
- updatePrevNextColor(textColorSecondary(requireContext()))
+ updatePrevNextColor()
nextButton.setOnClickListener { MusicPlayerRemote.playNextSong() }
previousButton.setOnClickListener { MusicPlayerRemote.back() }
}
- private fun updatePrevNextColor(color: Int) {
- nextButton.setColorFilter(color, PorterDuff.Mode.SRC_IN)
- previousButton.setColorFilter(color, PorterDuff.Mode.SRC_IN)
+ private fun updatePrevNextColor() {
+ nextButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN)
+ previousButton.setColorFilter(lastPlaybackControlsColor, PorterDuff.Mode.SRC_IN)
}
private fun setUpShuffleButton() {
diff --git a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
index 9e81ce695..25cc8a5d0 100644
--- a/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
+++ b/app/src/main/java/code/name/monkey/retromusic/fragments/player/material/MaterialFragment.kt
@@ -4,22 +4,57 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
+import androidx.core.view.ViewCompat
+import androidx.recyclerview.widget.LinearLayoutManager
import code.name.monkey.appthemehelper.util.ATHUtil
+import code.name.monkey.appthemehelper.util.ColorUtil
import code.name.monkey.appthemehelper.util.ToolbarContentTintHelper
+import code.name.monkey.retromusic.CustomBottomSheetBehavior
import code.name.monkey.retromusic.R
+import code.name.monkey.retromusic.activities.base.AbsSlidingMusicPanelActivity
+import code.name.monkey.retromusic.adapter.song.PlayingQueueAdapter
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.model.Song
import code.name.monkey.retromusic.util.color.MediaNotificationProcessor
+import com.google.android.material.bottomsheet.BottomSheetBehavior
import kotlinx.android.synthetic.main.fragment_material.*
+import kotlinx.android.synthetic.main.status_bar.*
/**
* @author Hemanth S (h4h13).
*/
-class MaterialFragment : AbsPlayerFragment() {
+class MaterialFragment : AbsPlayerFragment(), View.OnLayoutChangeListener {
+ private lateinit var queueAdapter: PlayingQueueAdapter
+ private val bottomSheetCallbackList = object : BottomSheetBehavior.BottomSheetCallback() {
+ override fun onSlide(bottomSheet: View, slideOffset: Float) {
+ (requireActivity() as AbsSlidingMusicPanelActivity).getBottomSheetBehavior()
+ .setAllowDragging(false)
+
+ sheetContent.setPadding(
+ sheetContent.paddingLeft,
+ (slideOffset * status_bar.height).toInt(),
+ sheetContent.paddingRight,
+ sheetContent.paddingBottom
+ )
+
+ playerControlsContainer.layoutParams.height = playerContainer.width
+ }
+
+ override fun onStateChanged(bottomSheet: View, newState: Int) {
+ val activity = requireActivity() as AbsSlidingMusicPanelActivity
+ if (newState == BottomSheetBehavior.STATE_EXPANDED || newState == BottomSheetBehavior.STATE_DRAGGING) {
+ activity.getBottomSheetBehavior().setAllowDragging(false)
+ } else {
+ activity.getBottomSheetBehavior().setAllowDragging(true)
+ }
+ }
+ }
override fun playerToolbar(): Toolbar {
return playerToolbar
@@ -50,6 +85,9 @@ class MaterialFragment : AbsPlayerFragment() {
}
override fun onColorChanged(color: MediaNotificationProcessor) {
+ val darkColor = ColorUtil.darkenColorTheme(color.backgroundColor)
+ playerContainer?.setBackgroundColor(ColorUtil.darkenColorTheme(color.backgroundColor))
+ upComing?.setBackgroundColor(ColorUtil.darkenColorTheme(darkColor))
playbackControlsFragment.setDark(color.backgroundColor)
lastColor = color.backgroundColor
callbacks?.onPaletteColorChanged()
@@ -83,6 +121,40 @@ class MaterialFragment : AbsPlayerFragment() {
super.onViewCreated(view, savedInstanceState)
setUpSubFragments()
setUpPlayerToolbar()
+ setupPanel()
+ setUpQueue()
+ getQueuePanel().addBottomSheetCallback(bottomSheetCallbackList)
+
+ playerQueueSheet.setOnTouchListener { _, _ ->
+ (requireActivity() as AbsSlidingMusicPanelActivity).getBottomSheetBehavior()
+ .setAllowDragging(false)
+ getQueuePanel().setAllowDragging(true)
+ return@setOnTouchListener false
+ }
+ }
+
+ private fun setUpQueue() {
+ queueAdapter = PlayingQueueAdapter(
+ requireActivity() as AppCompatActivity, mutableListOf(),
+ MusicPlayerRemote.position,
+ R.layout.item_queue
+ )
+ recyclerView.apply {
+ adapter = queueAdapter
+ layoutManager = LinearLayoutManager(requireContext())
+ }
+ }
+
+ private fun setupPanel() {
+ if (!ViewCompat.isLaidOut(playerContainer) || playerContainer.isLayoutRequested) {
+ playerContainer.addOnLayoutChangeListener(this)
+ return
+ }
+ val height = playerContainer?.height ?: 0
+ val width = playerContainer?.width ?: 0
+ val finalHeight = height - (playerControlsContainer.height - width)
+ val panel = getQueuePanel()
+ panel.peekHeight = finalHeight
}
private fun setUpSubFragments() {
@@ -108,6 +180,7 @@ class MaterialFragment : AbsPlayerFragment() {
override fun onServiceConnected() {
updateIsFavorite()
+ queueAdapter.swapDataSet(MusicPlayerRemote.playingQueue)
}
override fun onPlayingMetaChanged() {
@@ -120,4 +193,32 @@ class MaterialFragment : AbsPlayerFragment() {
return PlayerFragment()
}
}
+
+ private fun getQueuePanel(): CustomBottomSheetBehavior {
+ return CustomBottomSheetBehavior.from(playerQueueSheet) as CustomBottomSheetBehavior
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ getQueuePanel().removeBottomSheetCallback(bottomSheetCallbackList)
+ }
+
+ override fun onLayoutChange(
+ v: View?,
+ left: Int,
+ top: Int,
+ right: Int,
+ bottom: Int,
+ oldLeft: Int,
+ oldTop: Int,
+ oldRight: Int,
+ oldBottom: Int
+ ) {
+ val height = playerContainer?.height ?: 0
+ val width = playerContainer?.width ?: 0
+ val finalHeight = height - width
+ playerControlsContainer.layoutParams.height = height - width
+ val panel = getQueuePanel()
+ panel.peekHeight = finalHeight
+ }
}
diff --git a/app/src/main/res/layout/fragment_clasic_player.xml b/app/src/main/res/layout/fragment_clasic_player.xml
index 3f5861eb7..41ac2947f 100644
--- a/app/src/main/res/layout/fragment_clasic_player.xml
+++ b/app/src/main/res/layout/fragment_clasic_player.xml
@@ -5,7 +5,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
-
-
+
@@ -92,7 +91,6 @@
android:background="?attr/colorSurface"
tools:listitem="@layout/item_list" />
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_material.xml b/app/src/main/res/layout/fragment_material.xml
index cbc33a35d..f2308953e 100644
--- a/app/src/main/res/layout/fragment_material.xml
+++ b/app/src/main/res/layout/fragment_material.xml
@@ -1,5 +1,5 @@
-
-
-
-
-
-
-
-
@@ -35,33 +24,101 @@
android:name="code.name.monkey.retromusic.fragments.player.PlayerAlbumCoverFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:layout="@layout/fragment_album_cover" />
+ tools:layout="@layout/fragment_album_full_cover" />
+
+
+
+
+
+
+
+
+
+
-
+
-
-
+
-
+ android:background="?attr/colorSurface"
+ android:orientation="vertical">
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_material_playback_controls.xml b/app/src/main/res/layout/fragment_material_playback_controls.xml
index abd431675..7ff0c6dd5 100644
--- a/app/src/main/res/layout/fragment_material_playback_controls.xml
+++ b/app/src/main/res/layout/fragment_material_playback_controls.xml
@@ -30,9 +30,10 @@
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
app:labelBehavior="gone"
+ app:layout_constraintBottom_toTopOf="@id/playPauseButton"
app:layout_constraintEnd_toStartOf="@id/songTotalTime"
app:layout_constraintStart_toEndOf="@id/songCurrentProgress"
- app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/songInfo"
app:thumbRadius="@dimen/slider_thumb_radius"
app:trackHeight="@dimen/slider_track_height"
tools:ignore="RtlHardcoded,UnusedAttribute"
@@ -61,7 +62,7 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toBottomOf="@+id/progressSlider">
+ app:layout_constraintTop_toTopOf="parent">
@@ -155,11 +159,11 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/roundSelector"
- app:layout_constraintBottom_toTopOf="@+id/volumeFragmentContainer"
+ app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/nextButton"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/previousButton"
- app:layout_constraintTop_toBottomOf="@+id/songInfo"
+ app:layout_constraintTop_toBottomOf="@+id/progressSlider"
app:srcCompat="@drawable/ic_pause_sharp_white_64dp"
tools:tint="@color/md_black_1000" />
@@ -194,15 +198,12 @@
tools:ignore="MissingPrefix"
tools:tint="@color/md_black_1000" />
-
+ app:layout_constraintStart_toStartOf="parent" />
+
diff --git a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/ColorUtil.kt b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/ColorUtil.kt
index 57eaf4d69..59b09c2e7 100755
--- a/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/ColorUtil.kt
+++ b/appthemehelper/src/main/java/code/name/monkey/appthemehelper/util/ColorUtil.kt
@@ -33,13 +33,19 @@ object ColorUtil {
return shiftColor(color, 0.9f)
}
+ @ColorInt
+ fun darkenColorTheme(@ColorInt color: Int): Int {
+ return shiftColor(color, 0.8f)
+ }
+
@ColorInt
fun lightenColor(@ColorInt color: Int): Int {
return shiftColor(color, 1.1f)
}
fun isColorLight(@ColorInt color: Int): Boolean {
- val darkness = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255
+ val darkness =
+ 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255
return darkness < 0.4
}
@@ -94,8 +100,14 @@ object ColorUtil {
}
fun isColorSaturated(@ColorInt color: Int): Boolean {
- val max = Math.max(0.299 * Color.red(color), Math.max(0.587 * Color.green(color), 0.114 * Color.blue(color)))
- val min = Math.min(0.299 * Color.red(color), Math.min(0.587 * Color.green(color), 0.114 * Color.blue(color)))
+ val max = Math.max(
+ 0.299 * Color.red(color),
+ Math.max(0.587 * Color.green(color), 0.114 * Color.blue(color))
+ )
+ val min = Math.min(
+ 0.299 * Color.red(color),
+ Math.min(0.587 * Color.green(color), 0.114 * Color.blue(color))
+ )
val diff = Math.abs(max - min)
return diff > 20
}
@@ -122,12 +134,17 @@ object ColorUtil {
}
@ColorInt
- fun getReadableText(@ColorInt textColor: Int, @ColorInt backgroundColor: Int, difference: Int): Int {
+ fun getReadableText(
+ @ColorInt textColor: Int,
+ @ColorInt backgroundColor: Int,
+ difference: Int
+ ): Int {
var textColorFinal = textColor
val isLight = isColorLight(backgroundColor)
var i = 0
while (getDifference(textColorFinal, backgroundColor) < difference && i < 100) {
- textColorFinal = getMixedColor(textColorFinal, if (isLight) Color.BLACK else Color.WHITE)
+ textColorFinal =
+ getMixedColor(textColorFinal, if (isLight) Color.BLACK else Color.WHITE)
i++
}
@@ -137,7 +154,8 @@ object ColorUtil {
@ColorInt
fun getContrastColor(@ColorInt color: Int): Int {
// Counting the perceptive luminance - human eye favors green color...
- val a = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255
+ val a =
+ 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255
return if (a < 0.5) Color.BLACK else Color.WHITE
}
}