From 77c57846ed67413c1b2095a37bdb406d6ba50cf8 Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:10:02 -0400 Subject: [PATCH] fix: add padding to last item in recycler (#293) * fix: add padding to last item in recycler Stop guessing numbers to compensate for a view we can measure. by adding a method to measure them. * fix: avoid scrolling artifacts in nested --- app/src/main/java/ani/dantotsu/Functions.kt | 23 +++++++++++++++++++ .../dantotsu/media/MediaDetailsActivity.kt | 3 --- .../media/comments/CommentsFragment.kt | 5 ++++ .../ani/dantotsu/profile/ProfileActivity.kt | 2 +- .../ani/dantotsu/profile/ProfileFragment.kt | 4 ++++ .../ani/dantotsu/profile/StatsFragment.kt | 5 ++++ .../dantotsu/profile/activity/FeedFragment.kt | 5 ++++ app/src/main/res/layout/activity_profile.xml | 1 - app/src/main/res/layout/fragment_comments.xml | 4 ++-- app/src/main/res/layout/fragment_profile.xml | 3 ++- 10 files changed, 47 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index c8962104..d7ef638f 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -270,6 +270,29 @@ fun Activity.setNavigationTheme() { } } +/** + * Sets clipToPadding false and sets the combined height of navigation bars as bottom padding. + * + * When nesting multiple scrolling views, only call this method on the inner most scrolling view. + */ +fun ViewGroup.setBaseline(navBar: AnimatedBottomBar) { + navBar.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) + clipToPadding = false + setPadding(paddingLeft, paddingTop, paddingRight, navBarHeight + navBar.measuredHeight) +} + +/** + * Sets clipToPadding false and sets the combined height of navigation bars as bottom padding. + * + * When nesting multiple scrolling views, only call this method on the inner most scrolling view. + */ +fun ViewGroup.setBaseline(navBar: AnimatedBottomBar, overlayView: View) { + navBar.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) + overlayView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED) + clipToPadding = false + setPadding(paddingLeft, paddingTop, paddingRight, navBarHeight + navBar.measuredHeight + overlayView.measuredHeight) +} + fun Activity.reloadActivity() { Refresh.all() finish() diff --git a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt index a362141b..a7b8858f 100644 --- a/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/MediaDetailsActivity.kt @@ -127,9 +127,6 @@ class MediaDetailsActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedLi rightMargin = navBarRightMargin bottomMargin = navBarBottomMargin } - binding.commentMessageContainer.updateLayoutParams { - bottomMargin = navBarRightMargin - } binding.mediaBanner.updateLayoutParams { height += statusBarHeight } binding.mediaBannerNoKen.updateLayoutParams { height += statusBarHeight } binding.mediaClose.updateLayoutParams { topMargin += statusBarHeight } diff --git a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt index 0ec2d3bf..7e8143a4 100644 --- a/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/comments/CommentsFragment.kt @@ -28,6 +28,7 @@ import ani.dantotsu.connections.comments.CommentsAPI import ani.dantotsu.databinding.FragmentCommentsBinding import ani.dantotsu.loadImage import ani.dantotsu.media.MediaDetailsActivity +import ani.dantotsu.setBaseline import ani.dantotsu.settings.saving.PrefManager import ani.dantotsu.settings.saving.PrefName import ani.dantotsu.snackString @@ -73,6 +74,9 @@ class CommentsFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as MediaDetailsActivity + + binding.commentsList.setBaseline(activity.navBar, activity.binding.commentInputLayout) + //get the media id from the intent val mediaId = arguments?.getInt("mediaId") ?: -1 mediaName = arguments?.getString("mediaName") ?: "unknown" @@ -366,6 +370,7 @@ class CommentsFragment : Fragment() { override fun onResume() { super.onResume() tag = null + binding.commentsList.setBaseline(activity.navBar, activity.binding.commentInputLayout) section.groups.forEach { if (it is CommentItem && it.containsGif()) { it.notifyChanged() diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt index d5c2f0c7..abbe26e5 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileActivity.kt @@ -46,7 +46,7 @@ import kotlin.math.abs class ProfileActivity : AppCompatActivity(), AppBarLayout.OnOffsetChangedListener { lateinit var binding: ActivityProfileBinding private var selected: Int = 0 - private lateinit var navBar: AnimatedBottomBar + lateinit var navBar: AnimatedBottomBar override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt index d008f966..6fd425be 100644 --- a/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/ProfileFragment.kt @@ -30,6 +30,7 @@ import ani.dantotsu.media.CharacterAdapter import ani.dantotsu.media.Media import ani.dantotsu.media.MediaAdaptor import ani.dantotsu.media.user.ListActivity +import ani.dantotsu.setBaseline import ani.dantotsu.setSlideIn import ani.dantotsu.setSlideUp import ani.dantotsu.util.AniMarkdown.Companion.getFullAniHTML @@ -59,6 +60,8 @@ class ProfileFragment : Fragment() { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as ProfileActivity + binding.root.setBaseline(activity.navBar) + user = arguments?.getSerializableCompat("user") as Query.UserProfile viewLifecycleOwner.lifecycleScope.launch(Dispatchers.IO) { model.setData(user.id) @@ -144,6 +147,7 @@ class ProfileFragment : Fragment() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() + binding.root.setBaseline(activity.navBar) } } diff --git a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt index 2f01cac6..aaf0ed6f 100644 --- a/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/StatsFragment.kt @@ -17,6 +17,7 @@ import ani.dantotsu.profile.ChartBuilder.Companion.ChartPacket import ani.dantotsu.profile.ChartBuilder.Companion.ChartType import ani.dantotsu.profile.ChartBuilder.Companion.MediaType import ani.dantotsu.profile.ChartBuilder.Companion.StatType +import ani.dantotsu.setBaseline import ani.dantotsu.statusBarHeight import com.github.aachartmodel.aainfographics.aachartcreator.AAChartType import com.xwray.groupie.GroupieAdapter @@ -49,8 +50,11 @@ class StatsFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity = requireActivity() as ProfileActivity + user = arguments?.getSerializableCompat("user") as Query.UserProfile + binding.statisticList.setBaseline(activity.navBar) + binding.statisticList.adapter = adapter binding.statisticList.recycledViewPool.setMaxRecycledViews(0, 0) binding.statisticList.isNestedScrollingEnabled = true @@ -114,6 +118,7 @@ class StatsFragment : super.onResume() if (this::binding.isInitialized) { binding.statisticList.visibility = View.VISIBLE + binding.statisticList.setBaseline(activity.navBar) binding.root.requestLayout() if (!loadedFirstTime) { activity.lifecycleScope.launch { diff --git a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt index 7ef09eb5..f50502f1 100644 --- a/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt +++ b/app/src/main/java/ani/dantotsu/profile/activity/FeedFragment.kt @@ -18,6 +18,7 @@ import ani.dantotsu.connections.anilist.api.Activity import ani.dantotsu.databinding.FragmentFeedBinding import ani.dantotsu.media.MediaDetailsActivity import ani.dantotsu.profile.ProfileActivity +import ani.dantotsu.setBaseline import ani.dantotsu.snackString import ani.dantotsu.util.Logger import com.xwray.groupie.GroupieAdapter @@ -48,6 +49,9 @@ class FeedFragment : Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) activity = requireActivity() + + binding.listRecyclerView.setBaseline((activity as ProfileActivity).navBar) + binding.listRecyclerView.adapter = adapter binding.listRecyclerView.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.VERTICAL, false) @@ -63,6 +67,7 @@ class FeedFragment : Fragment() { super.onResume() if (this::binding.isInitialized) { binding.root.requestLayout() + binding.listRecyclerView.setBaseline((activity as ProfileActivity).navBar) if (!loadedFirstTime) { activity.lifecycleScope.launch(Dispatchers.IO) { val nulledId = if (activityId == -1) null else activityId diff --git a/app/src/main/res/layout/activity_profile.xml b/app/src/main/res/layout/activity_profile.xml index 2772f279..87d79dcb 100644 --- a/app/src/main/res/layout/activity_profile.xml +++ b/app/src/main/res/layout/activity_profile.xml @@ -270,7 +270,6 @@ diff --git a/app/src/main/res/layout/fragment_comments.xml b/app/src/main/res/layout/fragment_comments.xml index e2c66f0a..59f93c50 100644 --- a/app/src/main/res/layout/fragment_comments.xml +++ b/app/src/main/res/layout/fragment_comments.xml @@ -1,5 +1,6 @@ - diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index bf4e0c34..b7b12e47 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -1,6 +1,7 @@ -