Add transition fixes and improvements.

This commit is contained in:
Alex Hart 2022-03-23 15:20:05 -03:00 committed by Greyson Parrelli
parent 72b3a0555d
commit b0b1029d0f
7 changed files with 51 additions and 19 deletions

View file

@ -8,7 +8,6 @@ import android.util.TypedValue
import android.view.View import android.view.View
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
import androidx.annotation.Px import androidx.annotation.Px
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.doOnNextLayout import androidx.core.view.doOnNextLayout
import androidx.core.view.isVisible import androidx.core.view.isVisible
@ -161,10 +160,6 @@ class StoryTextPostView @JvmOverloads constructor(
hideCloseButton() hideCloseButton()
postAdjustLinkPreviewTranslationY() postAdjustLinkPreviewTranslationY()
doOnNextLayout {
(context as? AppCompatActivity)?.supportStartPostponedEnterTransition()
}
} }
fun bindLinkPreview(linkPreview: LinkPreview?): ListenableFuture<Boolean> { fun bindLinkPreview(linkPreview: LinkPreview?): ListenableFuture<Boolean> {

View file

@ -4,6 +4,7 @@ import android.content.Context
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.graphics.Paint import android.graphics.Paint
import android.graphics.Rect
import android.graphics.RectF import android.graphics.RectF
import android.util.AttributeSet import android.util.AttributeSet
import androidx.annotation.ColorInt import androidx.annotation.ColorInt
@ -15,6 +16,7 @@ class StoryTextView @JvmOverloads constructor(
attrs: AttributeSet? = null attrs: AttributeSet? = null
) : EmojiTextView(context, attrs) { ) : EmojiTextView(context, attrs) {
private val canvasBounds: Rect = Rect()
private val textBounds: RectF = RectF() private val textBounds: RectF = RectF()
private val wrappedBackgroundPaint = Paint().apply { private val wrappedBackgroundPaint = Paint().apply {
style = Paint.Style.FILL style = Paint.Style.FILL
@ -34,8 +36,9 @@ class StoryTextView @JvmOverloads constructor(
} }
override fun onDraw(canvas: Canvas) { override fun onDraw(canvas: Canvas) {
if (wrappedBackgroundPaint.color != Color.TRANSPARENT) { if (wrappedBackgroundPaint.color != Color.TRANSPARENT && layout != null) {
textBounds.set(left.toFloat(), top.toFloat(), right.toFloat(), bottom.toFloat()) canvas.getClipBounds(canvasBounds)
textBounds.set(canvasBounds)
val maxWidth = (0 until layout.lineCount).map { val maxWidth = (0 until layout.lineCount).map {
layout.getLineWidth(it) layout.getLineWidth(it)

View file

@ -169,7 +169,7 @@ class StoryViewerPageFragment :
val canCloseFromHorizontalSlide = requireView().translationX > DimensionUnit.DP.toPixels(56f) val canCloseFromHorizontalSlide = requireView().translationX > DimensionUnit.DP.toPixels(56f)
val canCloseFromVerticalSlide = requireView().translationY > DimensionUnit.DP.toPixels(56f) val canCloseFromVerticalSlide = requireView().translationY > DimensionUnit.DP.toPixels(56f)
if ((canCloseFromHorizontalSlide || canCloseFromVerticalSlide) && event.actionMasked == MotionEvent.ACTION_UP) { if ((canCloseFromHorizontalSlide || canCloseFromVerticalSlide) && event.actionMasked == MotionEvent.ACTION_UP) {
requireActivity().finish() requireActivity().onBackPressed()
} else { } else {
requireView().animate() requireView().animate()
.setInterpolator(StoryGestureListener.INTERPOLATOR) .setInterpolator(StoryGestureListener.INTERPOLATOR)

View file

@ -4,7 +4,11 @@ import android.annotation.SuppressLint
import android.os.Bundle import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.widget.ImageView
import android.widget.TextView 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.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import org.signal.core.util.DimensionUnit 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.CommunicationActions
import org.thoughtcrime.securesms.util.FragmentDialogs.displayInDialogAboveAnchor import org.thoughtcrime.securesms.util.FragmentDialogs.displayInDialogAboveAnchor
import org.thoughtcrime.securesms.util.fragments.requireListener import org.thoughtcrime.securesms.util.fragments.requireListener
import org.thoughtcrime.securesms.util.visible
class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview_fragment) { 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?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val storyTextPostView: StoryTextPostView = view.findViewById(R.id.story_text_post) 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 -> viewModel.state.observe(viewLifecycleOwner) { state ->
when (state.loadState) { when (state.loadState) {
@ -55,6 +66,8 @@ class StoryTextPostPreviewFragment : Fragment(R.layout.stories_text_post_preview
} else { } else {
storyTextPostView.setLinkPreviewClickListener(null) storyTextPostView.setLinkPreviewClickListener(null)
} }
requireActivity().supportStartPostponedEnterTransition()
loadPreview(storyTextThumb, storyTextPostView)
} }
StoryTextPostState.LoadState.FAILED -> { StoryTextPostState.LoadState.FAILED -> {
requireListener<MediaPreviewFragment.Events>().mediaNotAvailable() requireListener<MediaPreviewFragment.Events>().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") @SuppressLint("AlertDialogBuilderUsage")
private fun showLinkPreviewTooltip(view: View, linkPreview: LinkPreview) { private fun showLinkPreviewTooltip(view: View, linkPreview: LinkPreview) {
requireListener<Callback>().setIsDisplayingLinkPreviewTooltip(true) requireListener<Callback>().setIsDisplayingLinkPreviewTooltip(true)

View file

@ -19,15 +19,12 @@ class StoryTextPostViewModel(recordId: Long, repository: StoryTextPostRepository
init { init {
disposables += repository.getRecord(recordId) disposables += repository.getRecord(recordId)
.map { record ->
StoryTextPost.parseFrom(Base64.decode(record.body)) to record.linkPreviews.firstOrNull()
}
.subscribeBy( .subscribeBy(
onSuccess = { (post, previews) -> onSuccess = { record ->
store.update { state -> store.update { state ->
state.copy( state.copy(
storyTextPost = post, storyTextPost = StoryTextPost.parseFrom(Base64.decode(record.body)),
linkPreview = previews, linkPreview = record.linkPreviews.firstOrNull(),
loadState = StoryTextPostState.LoadState.LOADED loadState = StoryTextPostState.LoadState.LOADED
) )
} }

View file

@ -1,5 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<org.thoughtcrime.securesms.stories.StoryTextPostView xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/story_text_post"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" /> android:layout_height="match_parent">
<org.thoughtcrime.securesms.stories.StoryTextPostView
android:id="@+id/story_text_post"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/story_text_post_shared_element_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no" />
</FrameLayout>

View file

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> <transitionSet android:duration="200"
<transition class="org.thoughtcrime.securesms.stories.ScaleTransition" /> xmlns:android="http://schemas.android.com/apk/res/android">
<changeBounds/>
<changeTransform/>
<changeImageTransform/>
</transitionSet> </transitionSet>