From 0d8ff0ead09c7a1ce77b10e60f21a0e7462fb56a Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 29 Sep 2022 11:17:07 -0300 Subject: [PATCH] Update window insets logic for gallery and review screens. --- .../securesms/mediasend/CameraDisplay.kt | 8 +++- .../v2/gallery/MediaGalleryFragment.kt | 9 ++-- .../v2/review/MediaReviewFragment.kt | 11 ++--- .../util/SystemWindowInsetsSetter.kt | 43 +++++++++++++++++++ 4 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraDisplay.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraDisplay.kt index 8e76de6ec..960ff6908 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraDisplay.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraDisplay.kt @@ -109,13 +109,19 @@ enum class CameraDisplay( return (cameraCaptureButtonSize - cameraCaptureImageButtonSize) / 2 } + /** + * Get the camera display type given the current window metrics. Note that this + * will automatically invert the aspect ratio in the case of a non-portrait orientation, + * since we fix camera to portrait. + */ @JvmStatic fun getDisplay(activity: Activity): CameraDisplay { val windowMetricsCalculator = WindowMetricsCalculator.getOrCreate() val windowMetrics = windowMetricsCalculator.computeCurrentWindowMetrics(activity) val width = windowMetrics.bounds.width() val height = windowMetrics.bounds.height() - val aspectRatio = width.toFloat() / height + val winAr = width.toFloat() / height + val aspectRatio = if (winAr > 1f) 1 / winAr else winAr return when { aspectRatio <= DISPLAY_20_9.aspectRatio -> DISPLAY_20_9 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 21ab20f44..5a798bfec 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 @@ -4,6 +4,7 @@ import android.os.Bundle import android.view.View import androidx.activity.OnBackPressedCallback import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.WindowInsetsCompat import androidx.core.view.updateLayoutParams import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels @@ -18,6 +19,7 @@ import org.thoughtcrime.securesms.databinding.V2MediaGalleryFragmentBinding import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaRepository 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 @@ -53,12 +55,7 @@ class MediaGalleryFragment : Fragment(R.layout.v2_media_gallery_fragment) { callbacks = requireListener() val binding = V2MediaGalleryFragmentBinding.bind(view) - binding.root.setPadding( - 0, - 0, - 0, - ViewUtil.getNavigationBarHeight(view) - ) + SystemWindowInsetsSetter.attach(view, viewLifecycleOwner, WindowInsetsCompat.Type.navigationBars()) binding.mediaGalleryToolbar.updateLayoutParams { topMargin = ViewUtil.getStatusBarHeight(view) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index 85dc34c3e..b55934e84 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -43,7 +43,7 @@ import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.MediaUtil -import org.thoughtcrime.securesms.util.ViewUtil +import org.thoughtcrime.securesms.util.SystemWindowInsetsSetter import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.fragments.requireListener import org.thoughtcrime.securesms.util.views.TouchInterceptingFrameLayout @@ -88,17 +88,12 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { postponeEnterTransition() + SystemWindowInsetsSetter.attach(view, viewLifecycleOwner) + disposables.bindTo(viewLifecycleOwner) callback = requireListener() - view.setPadding( - 0, - ViewUtil.getStatusBarHeight(view), - 0, - ViewUtil.getNavigationBarHeight(view) - ) - drawToolButton = view.findViewById(R.id.draw_tool) cropAndRotateButton = view.findViewById(R.id.crop_and_rotate_tool) qualityButton = view.findViewById(R.id.quality_selector) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt new file mode 100644 index 000000000..68da241e7 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SystemWindowInsetsSetter.kt @@ -0,0 +1,43 @@ +package org.thoughtcrime.securesms.util + +import android.view.View +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner + +object SystemWindowInsetsSetter { + /** + * Updates the view whenever a layout occurs to properly set the system bar insets. setPadding is safe here because it will only trigger an extra layout + * call IF the values actually changed. + */ + fun attach(view: View, lifecycleOwner: LifecycleOwner, @WindowInsetsCompat.Type.InsetsType insetType: Int = WindowInsetsCompat.Type.systemBars()) { + val listener = view.doOnEachLayout { + val insets = ViewCompat.getRootWindowInsets(view)?.getInsets(insetType) + + if (insets != null) { + view.setPadding( + insets.left, + insets.top, + insets.right, + insets.bottom + ) + } else { + view.setPadding( + 0, + ViewUtil.getStatusBarHeight(view), + 0, + ViewUtil.getNavigationBarHeight(view) + ) + } + } + + val lifecycleObserver = object : DefaultLifecycleObserver { + override fun onDestroy(owner: LifecycleOwner) { + view.removeOnLayoutChangeListener(listener) + } + } + + lifecycleOwner.lifecycle.addObserver(lifecycleObserver) + } +}