diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt index 2109f5cc3e..3d4d1fcc42 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryFragment.kt @@ -7,8 +7,12 @@ import android.widget.Toast import androidx.activity.OnBackPressedCallback import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.marginEnd import androidx.core.view.updateLayoutParams +import androidx.core.view.updatePadding +import androidx.core.view.updatePaddingRelative import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.MutableLiveData @@ -29,7 +33,6 @@ import org.thoughtcrime.securesms.databinding.V2MediaGalleryFragmentBinding import org.thoughtcrime.securesms.mediasend.MediaRepository import org.thoughtcrime.securesms.mediasend.v2.review.MediaGalleryGridItemTouchListener import org.thoughtcrime.securesms.util.Material3OnScrollHelper -import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.fragments.requireListener @@ -73,15 +76,7 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { callbacks = requireListener() val binding = V2MediaGalleryFragmentBinding.bind(view) - SystemWindowInsetsSetter.attach(view, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars()) - - binding.mediaGalleryToolbar.updateLayoutParams { - topMargin = ViewUtil.getStatusBarHeight(view) - } - - binding.mediaGalleryStatusBarBackground.updateLayoutParams { - height = ViewUtil.getStatusBarHeight(view) - } + applyWindowInsets(view, binding) binding.mediaGalleryGrid.layoutManager = object : GridLayoutManager(requireContext(), SPAN_COUNT) { override fun canScrollVertically() = shouldEnableScrolling @@ -269,6 +264,52 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, onBackPressedCallback) } + /** + * The top bar spans the full width so its background covers the cutout, while everything that holds + * content is inset horizontally. Driven off the inset dispatch rather than read once, since our hosts + * declare `configChanges="orientation"` and never recreate this view on rotation. + */ + private fun applyWindowInsets(view: View, binding: V2MediaGalleryFragmentBinding) { + val rootPaddingBottom = view.paddingBottom + val toolbarPaddingLeft = binding.mediaGalleryToolbar.paddingLeft + val toolbarPaddingRight = binding.mediaGalleryToolbar.paddingRight + val managePaddingLeft = binding.mediaGalleryManageContainer.paddingLeft + val managePaddingRight = binding.mediaGalleryManageContainer.paddingRight + val selectedPaddingStart = binding.mediaGallerySelected.paddingStart + val countButtonMarginEnd = binding.mediaGalleryCountButton.marginEnd + + ViewCompat.setOnApplyWindowInsetsListener(view) { root, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars() or WindowInsetsCompat.Type.displayCutout()) + val isLtr = ViewUtil.isLtr(root) + val startInset = if (isLtr) insets.left else insets.right + val endInset = if (isLtr) insets.right else insets.left + + root.updatePadding(bottom = rootPaddingBottom + insets.bottom) + + binding.mediaGalleryStatusBarBackground.updateLayoutParams { + height = insets.top + } + + binding.mediaGalleryToolbar.updateLayoutParams { + topMargin = insets.top + } + + binding.mediaGalleryToolbar.updatePadding(left = toolbarPaddingLeft + insets.left, right = toolbarPaddingRight + insets.right) + binding.mediaGalleryManageContainer.updatePadding(left = managePaddingLeft + insets.left, right = managePaddingRight + insets.right) + binding.mediaGalleryGrid.updatePadding(left = insets.left, right = insets.right) + binding.mediaGalleryMissingPermissions.updatePadding(left = insets.left, right = insets.right) + binding.mediaGallerySelected.updatePaddingRelative(start = selectedPaddingStart + startInset) + + binding.mediaGalleryCountButton.updateLayoutParams { + marginEnd = countButtonMarginEnd + endInset + } + + windowInsets + } + + view.post { ViewCompat.requestApplyInsets(view) } + } + override fun onResume() { super.onResume() refreshMediaGallery() diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index 870afa77f1..fbe57abc6e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -23,6 +23,7 @@ import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import androidx.appcompat.app.AlertDialog; import androidx.core.content.ContextCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import com.bumptech.glide.load.DataSource; @@ -66,6 +67,7 @@ import org.thoughtcrime.securesms.scribbles.stickers.FeatureSticker; import org.thoughtcrime.securesms.scribbles.stickers.TappableRenderer; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.SaveAttachmentUtil; +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -234,12 +236,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu Mode mode = Mode.getByCode(requireArguments().getString(KEY_MODE)); if (mode == Mode.AVATAR_CAPTURE || mode == Mode.AVATAR_EDIT) { - view.setPadding( - 0, - ViewUtil.getStatusBarHeight(view), - 0, - ViewUtil.getNavigationBarHeight(view) - ); + SystemWindowInsetsSetter.attach(view, getViewLifecycleOwner(), WindowInsetsCompat.Type.systemBars()); } imageEditorHud = view.findViewById(R.id.scribble_hud);