From c5271a6dae20ebb85a820413d54189a76247fe94 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 27 Aug 2026 12:37:27 -0400 Subject: [PATCH] Fix edge-to-edge issue on receipt screen. --- .../components/settings/DSLSettingsFragment.kt | 14 +++++++++++--- .../detail/DonationReceiptDetailFragment.kt | 6 ++++++ .../receipts/list/DonationReceiptListFragment.kt | 5 +++++ .../list/DonationReceiptListPageFragment.kt | 4 ++++ .../res/layout/donation_receipt_list_fragment.xml | 1 + 5 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt index 2d3cc18109..c50f7cc5c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/DSLSettingsFragment.kt @@ -55,6 +55,12 @@ abstract class DSLSettingsFragment( */ protected open val listAvoidsKeyboard: Boolean = false + /** + * Cleared by layouts that anchor another view below the list, like a bottom action button. That view carries + * the navigation bar inset instead, so the list must not pad for it as well. + */ + protected open val listClearsNavigationBar: Boolean = true + @CallSuper override fun onViewCreated(view: View, savedInstanceState: Bundle?) { toolbar = view.findViewById(R.id.toolbar) @@ -120,7 +126,7 @@ abstract class DSLSettingsFragment( } recyclerView?.let { recycler -> - val insetTypes = WindowInsetsCompat.Type.navigationBars() or + val insetTypes = (if (listClearsNavigationBar) WindowInsetsCompat.Type.navigationBars() else 0) or (if (listScrollsBehindToolbar) WindowInsetsCompat.Type.statusBars() else 0) or (if (listAvoidsKeyboard) WindowInsetsCompat.Type.ime() else 0) @@ -128,8 +134,10 @@ abstract class DSLSettingsFragment( recycler.updatePadding(top = recycler.paddingTop + resources.getDimensionPixelSize(R.dimen.signal_m3_toolbar_height)) } - recycler.clipToPadding = false - SystemWindowInsetsSetter.attach(recycler, viewLifecycleOwner, insetTypes) + if (insetTypes != 0) { + recycler.clipToPadding = false + SystemWindowInsetsSetter.attach(recycler, viewLifecycleOwner, insetTypes) + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt index 5681aa91ef..c11aa5b976 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/detail/DonationReceiptDetailFragment.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.receipts.detail import android.content.Intent +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.viewModels import com.google.android.material.button.MaterialButton import org.thoughtcrime.securesms.R @@ -15,6 +16,7 @@ import org.thoughtcrime.securesms.components.settings.models.SplashImage import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord import org.thoughtcrime.securesms.payments.FiatMoneyUtil import org.thoughtcrime.securesms.util.DateUtils +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import java.util.Locale import org.signal.core.ui.R as CoreUiR @@ -23,6 +25,8 @@ class DonationReceiptDetailFragment : DSLSettingsFragment(layoutId = R.layout.do private lateinit var progressDialog: SignalProgressDialog + override val listClearsNavigationBar: Boolean = false + private val viewModel: DonationReceiptDetailViewModel by viewModels( factoryProducer = { DonationReceiptDetailViewModel.Factory( @@ -38,6 +42,8 @@ class DonationReceiptDetailFragment : DSLSettingsFragment(layoutId = R.layout.do val sharePngButton: MaterialButton = requireView().findViewById(R.id.share_png) sharePngButton.isEnabled = false + SystemWindowInsetsSetter.attach(sharePngButton, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars(), SystemWindowInsetsSetter.ApplyMode.MARGIN) + viewModel.state.observe(viewLifecycleOwner) { state -> if (state.inAppPaymentReceiptRecord != null) { val subscriptionName = InAppDonations.resolveLabel(requireContext(), state.inAppPaymentReceiptRecord) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt index ea120bcd90..9893f7818c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListFragment.kt @@ -3,13 +3,16 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.receipts import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import androidx.viewpager2.widget.ViewPager2 +import com.google.android.material.appbar.AppBarLayout import com.google.android.material.tabs.TabLayoutMediator import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.BoldSelectionTabItem import org.thoughtcrime.securesms.components.ControllableTabLayout +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter class DonationReceiptListFragment : Fragment(R.layout.donation_receipt_list_fragment) { @@ -22,6 +25,8 @@ class DonationReceiptListFragment : Fragment(R.layout.donation_receipt_list_frag findNavController().popBackStack() } + SystemWindowInsetsSetter.attach(view.findViewById(R.id.app_bar), viewLifecycleOwner, WindowInsetsCompat.Type.statusBars()) + pager.adapter = DonationReceiptListPageAdapter(this) BoldSelectionTabItem.registerListeners(tabs) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListPageFragment.kt index 10cf0b2354..a62d8b417e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/receipts/list/DonationReceiptListPageFragment.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.components.settings.app.subscription.receipts import android.os.Bundle import android.view.View import androidx.constraintlayout.widget.Group +import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -13,6 +14,7 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.TextPreference import org.thoughtcrime.securesms.database.model.InAppPaymentReceiptRecord import org.thoughtcrime.securesms.util.StickyHeaderDecoration +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.livedata.LiveDataUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.visible @@ -44,6 +46,8 @@ class DonationReceiptListPageFragment : Fragment(R.layout.donation_receipt_list_ view.findViewById(R.id.recycler).apply { this.adapter = adapter addItemDecoration(StickyHeaderDecoration(adapter, false, true, 0)) + clipToPadding = false + SystemWindowInsetsSetter.attach(this, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars()) } emptyStateGroup = view.findViewById(R.id.empty_state) diff --git a/app/src/main/res/layout/donation_receipt_list_fragment.xml b/app/src/main/res/layout/donation_receipt_list_fragment.xml index 3ebbaa132c..07c09a8900 100644 --- a/app/src/main/res/layout/donation_receipt_list_fragment.xml +++ b/app/src/main/res/layout/donation_receipt_list_fragment.xml @@ -8,6 +8,7 @@ android:orientation="vertical">