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 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> {
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
Loading…
Add table
Reference in a new issue