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 92124757..3efebdc9 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 0ac2d8c8..0290fb42 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 d1e50d3d..b3ea9c35 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 bdbff361..a2ec97f2 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 9e81ce69..25cc8a5d 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 3f5861eb..41ac2947 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 cbc33a35..f2308953 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 abd43167..7ff0c6dd 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 57eaf4d6..59b09c2e 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 } }