From b0b1029d0f4d558d7879d22a80ccaa048fe7a82f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 23 Mar 2022 15:20:05 -0300 Subject: [PATCH] Add transition fixes and improvements. --- .../securesms/stories/StoryTextPostView.kt | 5 ---- .../securesms/stories/StoryTextView.kt | 7 ++++-- .../viewer/page/StoryViewerPageFragment.kt | 2 +- .../text/StoryTextPostPreviewFragment.kt | 23 +++++++++++++++++++ .../viewer/text/StoryTextPostViewModel.kt | 9 +++----- .../stories_text_post_preview_fragment.xml | 17 +++++++++++--- .../main/res/transition/change_transform.xml | 7 ++++-- 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt index ec7d4f21a..fef97c859 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt @@ -8,7 +8,6 @@ import android.util.TypedValue import android.view.View import androidx.annotation.ColorInt import androidx.annotation.Px -import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.doOnNextLayout import androidx.core.view.isVisible @@ -161,10 +160,6 @@ class StoryTextPostView @JvmOverloads constructor( hideCloseButton() postAdjustLinkPreviewTranslationY() - - doOnNextLayout { - (context as? AppCompatActivity)?.supportStartPostponedEnterTransition() - } } fun bindLinkPreview(linkPreview: LinkPreview?): ListenableFuture { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextView.kt index dded60060..bb893d716 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextView.kt @@ -4,6 +4,7 @@ import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint +import android.graphics.Rect import android.graphics.RectF import android.util.AttributeSet import androidx.annotation.ColorInt @@ -15,6 +16,7 @@ class StoryTextView @JvmOverloads constructor( attrs: AttributeSet? = null ) : EmojiTextView(context, attrs) { + private val canvasBounds: Rect = Rect() private val textBounds: RectF = RectF() private val wrappedBackgroundPaint = Paint().apply { style = Paint.Style.FILL @@ -34,8 +36,9 @@ class StoryTextView @JvmOverloads constructor( } override fun onDraw(canvas: Canvas) { - if (wrappedBackgroundPaint.color != Color.TRANSPARENT) { - textBounds.set(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat()) + if (wrappedBackgroundPaint.color != Color.TRANSPARENT && layout != null) { + canvas.getClipBounds(canvasBounds) + textBounds.set(canvasBounds) val maxWidth = (0 until layout.lineCount).map { layout.getLineWidth(it) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index b89cb5732..6be77d8b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -169,7 +169,7 @@ class StoryViewerPageFragment : val canCloseFromHorizontalSlide = requireView().translationX > DimensionUnit.DP.toPixels(56f) val canCloseFromVerticalSlide = requireView().translationY > DimensionUnit.DP.toPixels(56f) if ((canCloseFromHorizontalSlide || canCloseFromVerticalSlide) && event.actionMasked == MotionEvent.ACTION_UP) { - requireActivity().finish() + requireActivity().onBackPressed() } else { requireView().animate() .setInterpolator(StoryGestureListener.INTERPOLATOR) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostPreviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostPreviewFragment.kt index 76c70dce8..1c67ae673 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostPreviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostPreviewFragment.kt @@ -4,7 +4,11 @@ import android.annotation.SuppressLint import android.os.Bundle import android.view.LayoutInflater import android.view.View +import android.widget.ImageView import android.widget.TextView +import androidx.activity.addCallback +import androidx.core.view.doOnNextLayout +import androidx.core.view.drawToBitmap import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import org.signal.core.util.DimensionUnit @@ -16,6 +20,7 @@ import org.thoughtcrime.securesms.stories.viewer.page.StoryPost import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.FragmentDialogs.displayInDialogAboveAnchor import org.thoughtcrime.securesms.util.fragments.requireListener +import org.thoughtcrime.securesms.util.visible class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview_fragment) { @@ -40,6 +45,12 @@ class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val storyTextPostView: StoryTextPostView = view.findViewById(R.id.story_text_post) + val storyTextThumb: ImageView = view.findViewById(R.id.story_text_post_shared_element_target) + + requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) { + storyTextThumb.visible = true + requireActivity().supportFinishAfterTransition() + } viewModel.state.observe(viewLifecycleOwner) { state -> when (state.loadState) { @@ -55,6 +66,8 @@ class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview } else { storyTextPostView.setLinkPreviewClickListener(null) } + requireActivity().supportStartPostponedEnterTransition() + loadPreview(storyTextThumb, storyTextPostView) } StoryTextPostState.LoadState.FAILED -> { requireListener().mediaNotAvailable() @@ -63,6 +76,16 @@ class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview } } + private fun loadPreview(storyTextThumb: ImageView, storyTextPreview: StoryTextPostView) { + storyTextPreview.doOnNextLayout { + storyTextThumb.setImageBitmap(storyTextPreview.drawToBitmap()) + requireActivity().supportStartPostponedEnterTransition() + storyTextThumb.postDelayed({ + storyTextThumb.visible = false + }, 200) + } + } + @SuppressLint("AlertDialogBuilderUsage") private fun showLinkPreviewTooltip(view: View, linkPreview: LinkPreview) { requireListener().setIsDisplayingLinkPreviewTooltip(true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostViewModel.kt index 6bca2e137..21b50fec1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/text/StoryTextPostViewModel.kt @@ -19,15 +19,12 @@ class StoryTextPostViewModel(recordId: Long, repository: StoryTextPostRepository init { disposables += repository.getRecord(recordId) - .map { record -> - StoryTextPost.parseFrom(Base64.decode(record.body)) to record.linkPreviews.firstOrNull() - } .subscribeBy( - onSuccess = { (post, previews) -> + onSuccess = { record -> store.update { state -> state.copy( - storyTextPost = post, - linkPreview = previews, + storyTextPost = StoryTextPost.parseFrom(Base64.decode(record.body)), + linkPreview = record.linkPreviews.firstOrNull(), loadState = StoryTextPostState.LoadState.LOADED ) } diff --git a/app/src/main/res/layout/stories_text_post_preview_fragment.xml b/app/src/main/res/layout/stories_text_post_preview_fragment.xml index 31ee9bbb7..fc30c37e0 100644 --- a/app/src/main/res/layout/stories_text_post_preview_fragment.xml +++ b/app/src/main/res/layout/stories_text_post_preview_fragment.xml @@ -1,5 +1,16 @@ - \ No newline at end of file + android:layout_height="match_parent"> + + + + + diff --git a/app/src/main/res/transition/change_transform.xml b/app/src/main/res/transition/change_transform.xml index d1d906fda..16ff1b06a 100644 --- a/app/src/main/res/transition/change_transform.xml +++ b/app/src/main/res/transition/change_transform.xml @@ -1,4 +1,7 @@ - - + + + + \ No newline at end of file