PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/activities/base/AbsSlidingMusicPanelActivit...

359 lines
14 KiB
Kotlin
Raw Normal View History

2020-10-06 08:46:04 +00:00
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.activities.base
2018-11-30 01:06:16 +00:00
import android.content.res.ColorStateList
2019-12-01 11:28:57 +00:00
import android.graphics.Color
2018-11-30 01:06:16 +00:00
import android.os.Bundle
2019-12-01 11:28:57 +00:00
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
2020-05-11 09:51:22 +00:00
import android.widget.FrameLayout
2020-08-13 08:24:36 +00:00
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
2020-10-02 18:05:09 +00:00
import androidx.fragment.app.commit
import code.name.monkey.appthemehelper.util.ATHUtil
2019-12-01 11:28:57 +00:00
import code.name.monkey.appthemehelper.util.ColorUtil
2019-02-23 17:39:02 +00:00
import code.name.monkey.retromusic.R
2020-05-09 05:55:42 +00:00
import code.name.monkey.retromusic.RetroBottomSheetBehavior
import code.name.monkey.retromusic.databinding.SlidingMusicPanelLayoutBinding
2020-10-11 17:22:34 +00:00
import code.name.monkey.retromusic.extensions.*
2020-07-28 19:18:34 +00:00
import code.name.monkey.retromusic.fragments.LibraryViewModel
2019-12-01 11:28:57 +00:00
import code.name.monkey.retromusic.fragments.MiniPlayerFragment
import code.name.monkey.retromusic.fragments.NowPlayingScreen
import code.name.monkey.retromusic.fragments.NowPlayingScreen.*
import code.name.monkey.retromusic.fragments.base.AbsPlayerFragment
import code.name.monkey.retromusic.fragments.player.adaptive.AdaptiveFragment
import code.name.monkey.retromusic.fragments.player.blur.BlurPlayerFragment
import code.name.monkey.retromusic.fragments.player.card.CardFragment
import code.name.monkey.retromusic.fragments.player.cardblur.CardBlurFragment
import code.name.monkey.retromusic.fragments.player.circle.CirclePlayerFragment
2020-10-02 12:56:17 +00:00
import code.name.monkey.retromusic.fragments.player.classic.ClassicPlayerFragment
import code.name.monkey.retromusic.fragments.player.color.ColorFragment
import code.name.monkey.retromusic.fragments.player.fit.FitFragment
import code.name.monkey.retromusic.fragments.player.flat.FlatPlayerFragment
import code.name.monkey.retromusic.fragments.player.full.FullPlayerFragment
import code.name.monkey.retromusic.fragments.player.gradient.GradientPlayerFragment
import code.name.monkey.retromusic.fragments.player.material.MaterialFragment
import code.name.monkey.retromusic.fragments.player.normal.PlayerFragment
2020-09-23 21:10:16 +00:00
import code.name.monkey.retromusic.fragments.player.peak.PeakPlayerFragment
import code.name.monkey.retromusic.fragments.player.plain.PlainPlayerFragment
import code.name.monkey.retromusic.fragments.player.simple.SimplePlayerFragment
import code.name.monkey.retromusic.fragments.player.tiny.TinyPlayerFragment
2019-05-19 17:10:21 +00:00
import code.name.monkey.retromusic.helper.MusicPlayerRemote
2019-12-01 15:27:01 +00:00
import code.name.monkey.retromusic.model.CategoryInfo
2020-06-06 18:57:28 +00:00
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.bottomsheet.BottomSheetBehavior.*
2020-07-28 19:18:34 +00:00
import org.koin.androidx.viewmodel.ext.android.viewModel
2019-02-23 17:39:02 +00:00
2020-08-21 14:19:15 +00:00
abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity() {
2019-12-01 11:28:57 +00:00
companion object {
val TAG: String = AbsSlidingMusicPanelActivity::class.java.simpleName
var fromNotification: Boolean = false
2019-12-01 11:28:57 +00:00
}
protected val libraryViewModel by viewModel<LibraryViewModel>()
private lateinit var bottomSheetBehavior: RetroBottomSheetBehavior<FrameLayout>
2020-10-02 12:56:17 +00:00
private var playerFragment: AbsPlayerFragment? = null
2019-12-01 11:28:57 +00:00
private var miniPlayerFragment: MiniPlayerFragment? = null
private var nowPlayingScreen: NowPlayingScreen? = null
2019-12-01 11:28:57 +00:00
private var taskColor: Int = 0
private var lightStatusBar: Boolean = false
protected abstract fun createContentView(): SlidingMusicPanelLayoutBinding
2019-12-01 11:28:57 +00:00
private val panelState: Int
get() = bottomSheetBehavior.state
private lateinit var binding: SlidingMusicPanelLayoutBinding
private val bottomSheetCallbackList = object : BottomSheetCallback() {
2019-12-01 11:28:57 +00:00
override fun onSlide(bottomSheet: View, slideOffset: Float) {
setMiniPlayerAlphaProgress(slideOffset)
binding.dimBackground.show()
binding.dimBackground.alpha = slideOffset
2019-12-01 11:28:57 +00:00
}
override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
STATE_EXPANDED -> {
2019-12-01 11:28:57 +00:00
onPanelExpanded()
}
STATE_COLLAPSED -> {
2019-12-01 11:28:57 +00:00
onPanelCollapsed()
binding.dimBackground.hide()
if (fromNotification) {
hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
fromNotification = false
}
}
STATE_SETTLING, STATE_DRAGGING -> {
if (fromNotification) {
getBottomNavigationView().isVisible = true
}
2019-12-01 11:28:57 +00:00
}
else -> {
println("Do something")
2019-12-01 11:28:57 +00:00
}
}
println(bottomSheetBehavior.peekHeight)
2019-12-01 11:28:57 +00:00
}
}
2020-09-23 21:10:16 +00:00
fun getBottomSheetBehavior() = bottomSheetBehavior
2019-12-01 11:28:57 +00:00
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = createContentView()
setContentView(binding.root)
2019-12-01 11:28:57 +00:00
chooseFragmentForTheme()
setupSlidingUpPanel()
2020-07-28 19:18:34 +00:00
setupBottomSheet()
2020-09-17 17:56:59 +00:00
val themeColor = resolveColor(android.R.attr.windowBackground, Color.GRAY)
binding.dimBackground.setBackgroundColor(ColorUtil.withAlpha(themeColor, 0.5f))
binding.dimBackground.setOnClickListener {
println("dimBackground")
collapsePanel()
2020-09-23 21:10:16 +00:00
}
binding.bottomNavigationView.apply {
val navbarHeight = RetroUtil.getNavigationBarHeight()
updatePadding(bottom = navbarHeight)
binding.bottomNavigationView.updateLayoutParams {
height = dip(R.dimen.mini_player_height) + navbarHeight
}
}
2020-09-23 21:10:16 +00:00
}
2020-05-11 09:51:22 +00:00
2020-07-28 19:18:34 +00:00
private fun setupBottomSheet() {
bottomSheetBehavior = from(binding.slidingPanel) as RetroBottomSheetBehavior
bottomSheetBehavior.addBottomSheetCallback(bottomSheetCallbackList)
2019-12-01 11:28:57 +00:00
}
override fun onResume() {
super.onResume()
if (nowPlayingScreen != PreferenceUtil.nowPlayingScreen) {
2019-12-01 11:28:57 +00:00
postRecreate()
}
2020-12-03 20:57:44 +00:00
if (bottomSheetBehavior.state == STATE_EXPANDED) {
setMiniPlayerAlphaProgress(1f)
}
2019-12-01 11:28:57 +00:00
}
override fun onDestroy() {
super.onDestroy()
bottomSheetBehavior.removeBottomSheetCallback(bottomSheetCallbackList)
2019-12-01 11:28:57 +00:00
}
protected fun wrapSlidingMusicPanel(): SlidingMusicPanelLayoutBinding {
return SlidingMusicPanelLayoutBinding.inflate(layoutInflater)
2019-12-01 11:28:57 +00:00
}
2020-08-11 21:31:09 +00:00
fun collapsePanel() {
bottomSheetBehavior.state = STATE_COLLAPSED
setMiniPlayerAlphaProgress(0f)
2019-12-01 11:28:57 +00:00
}
fun expandPanel() {
bottomSheetBehavior.state = STATE_EXPANDED
setMiniPlayerAlphaProgress(1f)
2019-12-01 11:28:57 +00:00
}
private fun setMiniPlayerAlphaProgress(progress: Float) {
val alpha = 1 - progress
miniPlayerFragment?.view?.alpha = alpha
miniPlayerFragment?.view?.visibility = if (alpha == 0f) View.GONE else View.VISIBLE
binding.bottomNavigationView.translationY = progress * 500
binding.bottomNavigationView.alpha = alpha
binding.playerFragmentContainer.alpha = (progress - 0.2F) / 0.2F
2019-12-01 11:28:57 +00:00
}
open fun onPanelCollapsed() {
// restore values
super.setLightStatusbarAuto(surfaceColor())
2019-12-01 11:28:57 +00:00
super.setTaskDescriptionColor(taskColor)
}
open fun onPanelExpanded() {
if (nowPlayingScreen == Blur ) {
super.setLightStatusbar(false)
} else {
super.setLightStatusbarAuto(surfaceColor())
}
2019-12-01 11:28:57 +00:00
}
private fun setupSlidingUpPanel() {
binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
2019-12-01 11:28:57 +00:00
override fun onGlobalLayout() {
binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
2020-09-23 21:10:16 +00:00
if (nowPlayingScreen != Peak) {
val params = binding.slidingPanel.layoutParams as ViewGroup.LayoutParams
2020-09-23 21:10:16 +00:00
params.height = ViewGroup.LayoutParams.MATCH_PARENT
binding.slidingPanel.layoutParams = params
2020-09-23 21:10:16 +00:00
}
2019-12-01 11:28:57 +00:00
when (panelState) {
STATE_EXPANDED -> onPanelExpanded()
STATE_COLLAPSED -> onPanelCollapsed()
2020-07-28 19:18:34 +00:00
else -> {
2020-10-06 08:46:04 +00:00
// playerFragment!!.onHide()
2020-07-28 19:18:34 +00:00
}
2019-12-01 11:28:57 +00:00
}
}
})
}
fun getBottomNavigationView(): BottomNavigationView {
return binding.bottomNavigationView
2019-12-01 11:28:57 +00:00
}
override fun onServiceConnected() {
super.onServiceConnected()
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.slidingPanel.viewTreeObserver.addOnGlobalLayoutListener(object :
ViewTreeObserver.OnGlobalLayoutListener {
2019-12-01 11:28:57 +00:00
override fun onGlobalLayout() {
binding.slidingPanel.viewTreeObserver.removeOnGlobalLayoutListener(this)
hideBottomBar(false)
2019-12-01 11:28:57 +00:00
}
})
} // don't call hideBottomBar(true) here as it causes a bug with the SlidingUpPanelLayout
}
override fun onQueueChanged() {
super.onQueueChanged()
hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
2019-12-01 11:28:57 +00:00
}
override fun onBackPressed() {
if (!handleBackPress()) super.onBackPressed()
}
private fun handleBackPress(): Boolean {
if (bottomSheetBehavior.peekHeight != 0 && playerFragment!!.onBackPressed()) return true
if (panelState == STATE_EXPANDED) {
2019-12-01 11:28:57 +00:00
collapsePanel()
return true
2020-01-24 17:27:43 +00:00
}
2019-12-01 11:28:57 +00:00
return false
}
override fun setLightStatusbar(enabled: Boolean) {
lightStatusBar = enabled
if (panelState == STATE_COLLAPSED) {
2019-12-01 11:28:57 +00:00
super.setLightStatusbar(enabled)
}
}
override fun setTaskDescriptionColor(color: Int) {
taskColor = color
if (panelState == STATE_COLLAPSED) {
2019-12-01 11:28:57 +00:00
super.setTaskDescriptionColor(color)
}
}
2020-05-11 09:51:22 +00:00
fun updateTabs() {
binding.bottomNavigationView.menu.clear()
2020-06-06 18:57:28 +00:00
val currentTabs: List<CategoryInfo> = PreferenceUtil.libraryCategory
2019-12-01 11:28:57 +00:00
for (tab in currentTabs) {
if (tab.visible) {
val menu = tab.category
binding.bottomNavigationView.menu.add(0, menu.id, 0, menu.stringRes)
.setIcon(menu.icon)
2019-12-01 11:28:57 +00:00
}
}
if (binding.bottomNavigationView.menu.size() == 1) {
binding.bottomNavigationView.hide()
2019-12-01 15:27:01 +00:00
}
2019-12-01 11:28:57 +00:00
}
2020-09-17 17:56:59 +00:00
2020-12-03 20:57:44 +00:00
fun setBottomBarVisibility(visible: Boolean) {
binding.bottomNavigationView.isVisible = visible
hideBottomBar(MusicPlayerRemote.playingQueue.isEmpty())
}
private fun hideBottomBar(hide: Boolean) {
val heightOfBar =
if (MusicPlayerRemote.isCasting) dip(R.dimen.cast_mini_player_height) else dip(R.dimen.mini_player_height)
val heightOfBarWithTabs = RetroUtil.getNavigationBarHeight() +
if (MusicPlayerRemote.isCasting) dip(R.dimen.mini_cast_player_height_expanded) else dip(
R.dimen.mini_player_height_expanded
)
val isVisible = binding.bottomNavigationView.isVisible
if (hide) {
bottomSheetBehavior.isHideable = true
bottomSheetBehavior.peekHeight = 0
ViewCompat.setElevation(binding.slidingPanel, 0f)
ViewCompat.setElevation(binding.bottomNavigationView, 10f)
collapsePanel()
} else {
if (MusicPlayerRemote.playingQueue.isNotEmpty()) {
bottomSheetBehavior.isHideable = false
ViewCompat.setElevation(binding.slidingPanel, 10f)
ViewCompat.setElevation(binding.bottomNavigationView, 10f)
if (isVisible) {
2020-12-03 20:57:44 +00:00
println("List")
if (bottomSheetBehavior.state != STATE_EXPANDED)
getBottomNavigationView().translateYAnimate(0F)
bottomSheetBehavior.peekHeightAnimate(heightOfBarWithTabs)
} else {
2020-12-03 20:57:44 +00:00
println("Details")
2020-10-12 07:57:11 +00:00
bottomSheetBehavior.peekHeight = heightOfBar
2020-09-17 17:56:59 +00:00
}
}
}
2020-09-17 17:56:59 +00:00
}
2020-09-23 21:10:16 +00:00
fun setAllowDragging(allowDragging: Boolean) {
bottomSheetBehavior.setAllowDragging(allowDragging)
hideBottomBar(false)
}
private fun chooseFragmentForTheme() {
nowPlayingScreen = PreferenceUtil.nowPlayingScreen
val fragment: Fragment = when (nowPlayingScreen) {
Blur -> BlurPlayerFragment()
Adaptive -> AdaptiveFragment()
Normal -> PlayerFragment()
Card -> CardFragment()
BlurCard -> CardBlurFragment()
Fit -> FitFragment()
Flat -> FlatPlayerFragment()
Full -> FullPlayerFragment()
Plain -> PlainPlayerFragment()
Simple -> SimplePlayerFragment()
Material -> MaterialFragment()
Color -> ColorFragment()
Gradient -> GradientPlayerFragment()
Tiny -> TinyPlayerFragment()
2020-09-23 21:10:16 +00:00
Peak -> PeakPlayerFragment()
Circle -> CirclePlayerFragment()
2020-10-02 12:56:17 +00:00
Classic -> ClassicPlayerFragment()
else -> PlayerFragment()
} // must implement AbsPlayerFragment
2020-10-02 18:05:09 +00:00
supportFragmentManager.commit {
replace(R.id.playerFragmentContainer, fragment)
}
supportFragmentManager.executePendingTransactions()
2020-10-02 18:05:09 +00:00
playerFragment = whichFragment<AbsPlayerFragment>(R.id.playerFragmentContainer)
miniPlayerFragment = whichFragment<MiniPlayerFragment>(R.id.miniPlayerFragment)
miniPlayerFragment?.view?.setOnClickListener { expandPanel() }
}
2020-10-06 08:46:04 +00:00
}