Add transition fixes and improvements.
This commit is contained in:
parent
72b3a0555d
commit
b0b1029d0f
7 changed files with 51 additions and 19 deletions
|
@ -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<Boolean> {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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<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")
|
||||
private fun showLinkPreviewTooltip(view: View, linkPreview: LinkPreview) {
|
||||
requireListener<Callback>().setIsDisplayingLinkPreviewTooltip(true)
|
||||
|
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
|
|
@ -1,5 +1,16 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<org.thoughtcrime.securesms.stories.StoryTextPostView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/story_text_post"
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
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>
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<transition class="org.thoughtcrime.securesms.stories.ScaleTransition" />
|
||||
<transitionSet android:duration="200"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<changeBounds/>
|
||||
<changeTransform/>
|
||||
<changeImageTransform/>
|
||||
</transitionSet>
|
Loading…
Add table
Reference in a new issue