Add transition fixes and improvements.

fork-5.53.8
Alex Hart 2022-03-23 15:20:05 -03:00 zatwierdzone przez Greyson Parrelli
rodzic 72b3a0555d
commit b0b1029d0f
7 zmienionych plików z 51 dodań i 19 usunięć

Wyświetl plik

@ -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> {

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)

Wyświetl plik

@ -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
) )
} }

Wyświetl plik

@ -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>

Wyświetl plik

@ -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>