From 4eb10faf49126f10ac77a62a41d2a90c4fe0f4e0 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Tue, 11 Oct 2022 16:02:45 -0400 Subject: [PATCH] Fix Z-ordering of preview media. --- .../animation/DepthPageTransformer.java | 2 +- .../animation/DepthPageTransformer2.kt | 41 +++++++++++++++++++ .../mediapreview/MediaPreviewV2Fragment.kt | 29 ++++++++----- 3 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer2.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java index 85ca770bf..32003f5f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer.java @@ -9,7 +9,7 @@ import androidx.viewpager2.widget.ViewPager2; /** * Based on https://developer.android.com/training/animation/screen-slide#depth-page */ -public final class DepthPageTransformer implements ViewPager.PageTransformer, ViewPager2.PageTransformer { +public final class DepthPageTransformer implements ViewPager.PageTransformer { private static final float MIN_SCALE = 0.75f; public void transformPage(@NonNull View view, float position) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer2.kt b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer2.kt new file mode 100644 index 000000000..13697478c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/animation/DepthPageTransformer2.kt @@ -0,0 +1,41 @@ +package org.thoughtcrime.securesms.animation + +import android.view.View +import androidx.annotation.RequiresApi +import androidx.viewpager2.widget.ViewPager2 + +private const val MIN_SCALE = 0.75f + +/** + * Lifted from https://developer.android.com/develop/ui/views/animations/screen-slide-2#depth-page + */ +@RequiresApi(21) +class DepthPageTransformer2 : ViewPager2.PageTransformer { + + override fun transformPage(view: View, position: Float) { + view.apply { + val pageWidth = width + when { + position < -1 -> alpha = 0f + position <= 0 -> { + alpha = 1f + translationX = 0f + translationZ = 0f + scaleX = 1f + scaleY = 1f + } + position <= 1 -> { + alpha = 1 - position + + translationX = pageWidth * -position + translationZ = -1f + + val scaleFactor = (MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position))) + scaleX = scaleFactor + scaleY = scaleFactor + } + else -> alpha = 0f + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index ab92a9130..470c6eb60 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -18,6 +18,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager +import androidx.viewpager2.widget.ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.dialog.MaterialAlertDialogBuilder @@ -26,7 +27,7 @@ import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.animation.DepthPageTransformer +import org.thoughtcrime.securesms.animation.DepthPageTransformer2 import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.components.ViewBinderDelegate import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment @@ -69,16 +70,7 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med initializeViewModel(args) initializeToolbar(binding.toolbar, args) - binding.mediaPager.offscreenPageLimit = 1 - binding.mediaPager.setPageTransformer(DepthPageTransformer()) - val adapter = MediaPreviewV2Adapter(this) - binding.mediaPager.adapter = adapter - binding.mediaPager.registerOnPageChangeCallback(object : OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - super.onPageSelected(position) - viewModel.setCurrentPage(position) - } - }) + initializeViewPager() initializeFullScreenUi() initializeAlbumRail() anchorMarginsToBottomInsets(binding.mediaPreviewDetailsContainer) @@ -102,6 +94,21 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med } } + private fun initializeViewPager() { + binding.mediaPager.offscreenPageLimit = OFFSCREEN_PAGE_LIMIT_DEFAULT + if (Build.VERSION.SDK_INT >= 21) { + binding.mediaPager.setPageTransformer(DepthPageTransformer2()) + } + val adapter = MediaPreviewV2Adapter(this) + binding.mediaPager.adapter = adapter + binding.mediaPager.registerOnPageChangeCallback(object : OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + viewModel.setCurrentPage(position) + } + }) + } + private fun initializeAlbumRail() { binding.mediaPreviewAlbumRail.itemAnimator = null // Or can crash when set to INVISIBLE while animating by FullscreenHelper https://issuetracker.google.com/issues/148720682 binding.mediaPreviewAlbumRail.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)