Better implementation for insets and bottom padding

This commit is contained in:
Prathamesh More 2022-05-31 01:30:56 +05:30
parent 97e37dd7b9
commit 45a3899a0d
29 changed files with 470 additions and 320 deletions

View file

@ -398,6 +398,8 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
if (binding.bottomNavigationView.menu.size() == 1) {
isInOneTabMode = true
binding.bottomNavigationView.isVisible = false
} else {
isInOneTabMode = false
}
}
@ -470,7 +472,7 @@ abstract class AbsSlidingMusicPanelActivity : AbsMusicServiceActivity(),
bottomSheetBehavior.peekHeight = heightOfBarWithTabs
}
libraryViewModel.setFabMargin(this,
dip(R.dimen.mini_player_height_expanded))
dip(R.dimen.bottom_nav_mini_player_height))
} else {
logD("Details")
if (animate) {

View file

@ -46,7 +46,7 @@ class AboutFragment : Fragment(R.layout.fragment_about), View.OnClickListener {
binding.aboutContent.root.applyInsetter {
type(navigationBars = true) {
padding()
padding(vertical = true)
}
}
}

View file

@ -32,7 +32,6 @@ import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.interfaces.IScrollHelper
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.ThemedFastScroller.create
@ -61,6 +60,7 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
mainActivity.supportActionBar?.title = null
initLayoutManager()
initAdapter()
checkForMargins()
setUpRecyclerView()
setupToolbar()
binding.shuffleButton.fitsSystemWindows = PreferenceUtil.isFullScreenMode
@ -118,7 +118,6 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
adapter = this@AbsRecyclerViewFragment.adapter
create(this)
}
checkForPadding()
}
protected open fun createFastScroller(recyclerView: RecyclerView): FastScroller {
@ -131,7 +130,6 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
override fun onChanged() {
super.onChanged()
checkIsEmpty()
checkForPadding()
}
})
}
@ -148,16 +146,12 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
binding.empty.isVisible = adapter!!.itemCount == 0
}
private fun checkForPadding() {
val itemCount: Int = adapter?.itemCount ?: 0
binding.recyclerView.updatePadding(
bottom = if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
dip(R.dimen.mini_player_height_expanded)
} else {
dip(R.dimen.bottom_nav_height)
private fun checkForMargins() {
if (mainActivity.bottomNavigationView.isVisible) {
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = dip(R.dimen.bottom_nav_height)
}
)
}
}
private fun initLayoutManager() {
@ -169,16 +163,6 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
@NonNull
protected abstract fun createAdapter(): A
override fun onQueueChanged() {
super.onQueueChanged()
checkForPadding()
}
override fun onServiceConnected() {
super.onServiceConnected()
checkForPadding()
}
protected fun invalidateLayoutManager() {
initLayoutManager()
binding.recyclerView.layoutManager = layoutManager
@ -232,6 +216,11 @@ abstract class AbsRecyclerViewFragment<A : RecyclerView.Adapter<*>, LM : Recycle
return false
}
override fun onResume() {
super.onResume()
checkForMargins()
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null

View file

@ -17,16 +17,14 @@ import android.content.Context
import android.media.MediaScannerConnection
import android.os.Bundle
import android.os.Environment
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.view.*
import android.webkit.MimeTypeMap
import androidx.activity.OnBackPressedCallback
import androidx.appcompat.widget.PopupMenu
import androidx.appcompat.widget.Toolbar
import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.lifecycle.lifecycleScope
import androidx.loader.app.LoaderManager
import androidx.loader.content.Loader
@ -45,7 +43,6 @@ import code.name.monkey.retromusic.databinding.FragmentFolderBinding
import code.name.monkey.retromusic.extensions.*
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote.openQueue
import code.name.monkey.retromusic.helper.MusicPlayerRemote.playingQueue
import code.name.monkey.retromusic.helper.menu.SongsMenuHelper
import code.name.monkey.retromusic.interfaces.ICabCallback
import code.name.monkey.retromusic.interfaces.ICabHolder
@ -110,6 +107,7 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
reenterTransition = MaterialFadeThrough()
setUpBreadCrumbs()
checkForMargins()
setUpRecyclerView()
setUpAdapter()
setUpTitle()
@ -385,14 +383,9 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
return false
}
override fun onQueueChanged() {
super.onQueueChanged()
checkForPadding()
}
override fun onServiceConnected() {
super.onServiceConnected()
checkForPadding()
override fun onResume() {
super.onResume()
checkForMargins()
}
override fun openCab(menuRes: Int, callback: ICabCallback): AttachedCab {
@ -413,13 +406,11 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
return cab as AttachedCab
}
private fun checkForPadding() {
val count = adapter?.itemCount ?: 0
if (_binding != null) {
binding.recyclerView.updatePadding(
bottom = if (count > 0 && playingQueue.isNotEmpty()) dip(R.dimen.mini_player_height_expanded)
else dip(R.dimen.mini_player_height)
)
private fun checkForMargins() {
if (mainActivity.bottomNavigationView.isVisible) {
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = dip(R.dimen.bottom_nav_height)
}
}
}
@ -608,7 +599,6 @@ class FoldersFragment : AbsMainActivityFragment(R.layout.fragment_folder),
override fun onChanged() {
super.onChanged()
checkIsEmpty()
checkForPadding()
}
})
binding.recyclerView.adapter = adapter

View file

@ -15,17 +15,15 @@
package code.name.monkey.retromusic.fragments.home
import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.*
import android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM
import android.view.View
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.os.bundleOf
import androidx.core.text.parseAsHtml
import androidx.core.view.doOnLayout
import androidx.core.view.doOnPreDraw
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.navigation.fragment.FragmentNavigatorExtras
import androidx.navigation.fragment.findNavController
import androidx.recyclerview.widget.LinearLayoutManager
@ -38,6 +36,7 @@ import code.name.monkey.retromusic.databinding.FragmentHomeBinding
import code.name.monkey.retromusic.dialogs.CreatePlaylistDialog
import code.name.monkey.retromusic.dialogs.ImportPlaylistDialog
import code.name.monkey.retromusic.extensions.accentColor
import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.extensions.drawNextToNavbar
import code.name.monkey.retromusic.extensions.elevatedAccentColor
import code.name.monkey.retromusic.fragments.ReloadType
@ -72,6 +71,8 @@ class HomeFragment :
enterTransition = MaterialFadeThrough().addTarget(binding.contentContainer)
reenterTransition = MaterialFadeThrough().addTarget(binding.contentContainer)
checkForMargins()
val homeAdapter = HomeAdapter(mainActivity)
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(mainActivity)
@ -190,6 +191,14 @@ class HomeFragment :
binding.actionShuffle.elevatedAccentColor()
}
private fun checkForMargins() {
if (mainActivity.bottomNavigationView.isVisible) {
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = dip(R.dimen.bottom_nav_height)
}
}
}
override fun onCreateMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.menu_main, menu)
menu.removeItem(R.id.action_grid_size)
@ -212,12 +221,14 @@ class HomeFragment :
}
fun setSharedAxisXTransitions() {
exitTransition = MaterialSharedAxis(MaterialSharedAxis.X, true).addTarget(CoordinatorLayout::class.java)
exitTransition =
MaterialSharedAxis(MaterialSharedAxis.X, true).addTarget(CoordinatorLayout::class.java)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
}
private fun setSharedAxisYTransitions() {
exitTransition = MaterialSharedAxis(MaterialSharedAxis.Y, true).addTarget(CoordinatorLayout::class.java)
exitTransition =
MaterialSharedAxis(MaterialSharedAxis.Y, true).addTarget(CoordinatorLayout::class.java)
reenterTransition = MaterialSharedAxis(MaterialSharedAxis.Y, false)
}
@ -301,7 +312,9 @@ class HomeFragment :
override fun onResume() {
super.onResume()
checkForMargins()
libraryViewModel.forceReload(ReloadType.HomeSections)
exitTransition = null
}
override fun onDestroyView() {

View file

@ -29,7 +29,6 @@ import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
import code.name.monkey.retromusic.*
import code.name.monkey.retromusic.adapter.album.AlbumAdapter
import code.name.monkey.retromusic.adapter.artist.ArtistAdapter
@ -37,7 +36,6 @@ import code.name.monkey.retromusic.adapter.song.ShuffleButtonSongAdapter
import code.name.monkey.retromusic.adapter.song.SongAdapter
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
import code.name.monkey.retromusic.db.toSong
import code.name.monkey.retromusic.extensions.dipToPix
import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.interfaces.IAlbumClickListener
@ -71,7 +69,8 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
RECENT_ARTISTS,
TOP_ALBUMS,
RECENT_ALBUMS,
FAVOURITES -> {
FAVOURITES,
-> {
enterTransition = MaterialSharedAxis(MaterialSharedAxis.X, true)
returnTransition = MaterialSharedAxis(MaterialSharedAxis.X, false)
}
@ -103,13 +102,6 @@ class DetailListFragment : AbsMainActivityFragment(R.layout.fragment_playlist_de
TOP_PLAYED_PLAYLIST -> topPlayed()
}
binding.recyclerView.adapter?.registerAdapterDataObserver(object : AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
val height = dipToPix(52f)
binding.recyclerView.updatePadding(bottom = height.toInt())
}
})
binding.appBarLayout.statusBarForeground =
MaterialShapeDrawable.createWithElevationOverlay(requireContext())
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {

View file

@ -17,10 +17,8 @@ import code.name.monkey.retromusic.adapter.song.OrderablePlaylistSongAdapter
import code.name.monkey.retromusic.databinding.FragmentPlaylistDetailBinding
import code.name.monkey.retromusic.db.PlaylistWithSongs
import code.name.monkey.retromusic.db.toSongs
import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.extensions.surfaceColor
import code.name.monkey.retromusic.fragments.base.AbsMainActivityFragment
import code.name.monkey.retromusic.helper.MusicPlayerRemote
import code.name.monkey.retromusic.helper.menu.PlaylistMenuHelper
import code.name.monkey.retromusic.interfaces.ICabCallback
import code.name.monkey.retromusic.interfaces.ICabHolder
@ -129,17 +127,7 @@ class PlaylistDetailsFragment : AbsMainActivityFragment(R.layout.fragment_playli
return PlaylistMenuHelper.handleMenuClick(requireActivity(), playlist, item)
}
private fun checkForPadding() {
val itemCount: Int = playlistSongAdapter.itemCount
if (itemCount > 0 && MusicPlayerRemote.playingQueue.isNotEmpty()) {
binding.recyclerView.updatePadding(bottom = dip(R.dimen.mini_player_height))
} else {
binding.recyclerView.updatePadding(bottom = 0)
}
}
private fun checkIsEmpty() {
checkForPadding()
binding.empty.isVisible = playlistSongAdapter.itemCount == 0
binding.emptyText.isVisible = playlistSongAdapter.itemCount == 0
}

View file

@ -146,14 +146,20 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
}
}
private fun checkForMargins() {
if (mainActivity.bottomNavigationView.isVisible) {
binding.recyclerView.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = dip(R.dimen.bottom_nav_height)
}
}
}
private fun setupRecyclerView() {
searchAdapter = SearchAdapter(requireActivity(), emptyList())
searchAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() {
override fun onChanged() {
super.onChanged()
binding.empty.isVisible = searchAdapter.itemCount < 1
val height = dipToPix(52f)
binding.recyclerView.updatePadding(bottom = height.toInt())
}
})
binding.recyclerView.apply {
@ -219,6 +225,11 @@ class SearchFragment : AbsMainActivityFragment(R.layout.fragment_search),
}
}
override fun onResume() {
super.onResume()
checkForMargins()
}
override fun onDestroyView() {
hideKeyboard(view)
super.onDestroyView()

View file

@ -19,12 +19,14 @@ import android.graphics.drawable.ColorDrawable
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.core.view.updatePadding
import androidx.preference.ListPreference
import androidx.preference.Preference
import androidx.preference.PreferenceManager
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEPreferenceFragmentCompat
import code.name.monkey.appthemehelper.util.VersionUtils
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.extensions.dip
import code.name.monkey.retromusic.extensions.showToast
import code.name.monkey.retromusic.preferences.*
import code.name.monkey.retromusic.util.NavigationUtil
@ -70,9 +72,10 @@ abstract class AbsSettingsFragment : ATEPreferenceFragmentCompat() {
listView.overScrollMode = View.OVER_SCROLL_NEVER
}
listView.updatePadding(bottom = dip(R.dimen.mini_player_height))
listView.applyInsetter {
type(navigationBars = true) {
padding()
padding(vertical = true)
}
}
invalidateSettings()

View file

@ -17,10 +17,7 @@ package code.name.monkey.retromusic.fragments.settings
import android.os.Bundle
import android.view.View
import code.name.monkey.appthemehelper.common.prefs.supportv7.ATEListPreference
import code.name.monkey.retromusic.HOME_ALBUM_GRID_STYLE
import code.name.monkey.retromusic.HOME_ARTIST_GRID_STYLE
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.TAB_TEXT_MODE
import code.name.monkey.retromusic.*
class PersonalizeSettingsFragment : AbsSettingsFragment() {

View file

@ -3,9 +3,9 @@ package code.name.monkey.retromusic.util
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.net.Uri
import android.util.Log
import android.widget.Toast
import androidx.core.net.toUri
import androidx.fragment.app.Fragment
import code.name.monkey.retromusic.BuildConfig
import code.name.monkey.retromusic.extensions.showToast
@ -26,9 +26,9 @@ fun Activity.maybeShowAnnoyingToasts() {
showToast("Support us by downloading the original version from Play Store.", Toast.LENGTH_LONG)
val packageName = "code.name.monkey.retromusic"
try {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName")))
startActivity(Intent(Intent.ACTION_VIEW, "market://details?id=$packageName".toUri()))
} catch (e: ActivityNotFoundException) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://play.google.com/store/apps/details?id=$packageName")))
startActivity(Intent(Intent.ACTION_VIEW, "https://play.google.com/store/apps/details?id=$packageName".toUri()))
}
}
}

View file

@ -4,7 +4,9 @@ import android.content.Context
import android.util.AttributeSet
import androidx.constraintlayout.widget.ConstraintLayout
import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
import code.name.monkey.retromusic.util.PreferenceUtil
import code.name.monkey.retromusic.util.RetroUtil
import dev.chrisbanes.insetter.applyInsetter
class InsetsConstraintLayout @JvmOverloads constructor(
context: Context,
@ -12,7 +14,11 @@ class InsetsConstraintLayout @JvmOverloads constructor(
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr) {
init {
if (!isInEditMode && !RetroUtil.isLandscape)
drawAboveSystemBarsWithPadding()
if (!isInEditMode && !PreferenceUtil.isFullScreenMode)
applyInsetter {
type(navigationBars = true) {
padding(vertical = true)
}
}
}
}

View file

@ -1,18 +0,0 @@
package code.name.monkey.retromusic.views.insets
import android.content.Context
import android.util.AttributeSet
import android.widget.LinearLayout
import code.name.monkey.retromusic.extensions.drawAboveSystemBarsWithPadding
import code.name.monkey.retromusic.util.RetroUtil
class InsetsLinearLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : LinearLayout(context, attrs, defStyleAttr) {
init {
if (!RetroUtil.isLandscape)
drawAboveSystemBarsWithPadding()
}
}

View file

@ -2,26 +2,21 @@ package code.name.monkey.retromusic.views.insets
import android.content.Context
import android.util.AttributeSet
import androidx.annotation.Px
import androidx.recyclerview.widget.RecyclerView
import code.name.monkey.retromusic.extensions.applyBottomInsets
import code.name.monkey.retromusic.util.PreferenceUtil
import dev.chrisbanes.insetter.applyInsetter
class InsetsRecyclerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
defStyleAttr: Int = 0,
) : RecyclerView(context, attrs, defStyleAttr) {
init {
applyBottomInsets()
}
fun updatePadding(
@Px left: Int = paddingLeft,
@Px top: Int = paddingTop,
@Px right: Int = paddingRight,
@Px bottom: Int = paddingBottom
) {
setPadding(left, top, right, bottom)
applyBottomInsets()
if (!isInEditMode && !PreferenceUtil.isFullScreenMode)
applyInsetter {
type(navigationBars = true) {
padding(vertical = true)
}
}
}
}