Fix flashing when send/recv messages in a new conversation.

fork-5.53.8
Alex Hart 2021-10-29 11:22:15 -03:00 zatwierdzone przez Greyson Parrelli
rodzic b92a41ab70
commit 4f3c545eda
3 zmienionych plików z 24 dodań i 8 usunięć

Wyświetl plik

@ -225,7 +225,7 @@ public class ConversationAdapter
case MESSAGE_TYPE_HEADER: case MESSAGE_TYPE_HEADER:
return new HeaderViewHolder(CachedInflater.from(parent.getContext()).inflate(R.layout.cursor_adapter_header_footer_view, parent, false)); return new HeaderViewHolder(CachedInflater.from(parent.getContext()).inflate(R.layout.cursor_adapter_header_footer_view, parent, false));
case MESSAGE_TYPE_FOOTER: case MESSAGE_TYPE_FOOTER:
return new HeaderFooterViewHolder(CachedInflater.from(parent.getContext()).inflate(R.layout.cursor_adapter_header_footer_view, parent, false)); return new FooterViewHolder(CachedInflater.from(parent.getContext()).inflate(R.layout.cursor_adapter_header_footer_view, parent, false));
default: default:
throw new IllegalStateException("Cannot create viewholder for type: " + viewType); throw new IllegalStateException("Cannot create viewholder for type: " + viewType);
} }
@ -748,7 +748,7 @@ public class ConversationAdapter
} }
} }
public static class HeaderFooterViewHolder extends RecyclerView.ViewHolder { public abstract static class HeaderFooterViewHolder extends RecyclerView.ViewHolder {
private ViewGroup container; private ViewGroup container;
@ -777,6 +777,10 @@ public class ConversationAdapter
} }
} }
public static class FooterViewHolder extends HeaderFooterViewHolder {
FooterViewHolder(@NonNull View itemView) { super(itemView); }
}
public static class HeaderViewHolder extends HeaderFooterViewHolder { public static class HeaderViewHolder extends HeaderFooterViewHolder {
HeaderViewHolder(@NonNull View itemView) { HeaderViewHolder(@NonNull View itemView) {
super(itemView); super(itemView);

Wyświetl plik

@ -45,7 +45,8 @@ class ConversationItemAnimator(
if (viewHolder is ConversationAdapter.HeaderViewHolder && if (viewHolder is ConversationAdapter.HeaderViewHolder &&
!pendingSlideAnimations.containsKey(viewHolder) && !pendingSlideAnimations.containsKey(viewHolder) &&
!slideAnimations.containsKey(viewHolder) && !slideAnimations.containsKey(viewHolder) &&
shouldPlayMessageAnimations() shouldPlayMessageAnimations() &&
isParentFilled()
) { ) {
pendingSlideAnimations[viewHolder] = TweeningInfo(0f, viewHolder.itemView.height.toFloat()) pendingSlideAnimations[viewHolder] = TweeningInfo(0f, viewHolder.itemView.height.toFloat())
dispatchAnimationStarted(viewHolder) dispatchAnimationStarted(viewHolder)
@ -71,7 +72,7 @@ class ConversationItemAnimator(
return false return false
} }
if (operation == Operation.CHANGE && !isParentFilled() || slideAnimations.containsKey(viewHolder)) { if (operation == Operation.CHANGE || slideAnimations.containsKey(viewHolder)) {
dispatchAnimationFinished(viewHolder) dispatchAnimationFinished(viewHolder)
return false return false
} }
@ -100,8 +101,7 @@ class ConversationItemAnimator(
} }
override fun animatePersistence(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo): Boolean { override fun animatePersistence(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo): Boolean {
val isInMultiSelectMode = isInMultiSelectMode() return if (!isInMultiSelectMode() && shouldPlayMessageAnimations() && isParentFilled()) {
return if (!isInMultiSelectMode && shouldPlayMessageAnimations()) {
if (pendingSlideAnimations.contains(viewHolder) || slideAnimations.containsKey(viewHolder)) { if (pendingSlideAnimations.contains(viewHolder) || slideAnimations.containsKey(viewHolder)) {
dispatchAnimationFinished(viewHolder) dispatchAnimationFinished(viewHolder)
false false

Wyświetl plik

@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.giph.mp4
import android.graphics.Canvas import android.graphics.Canvas
import androidx.core.view.children import androidx.core.view.children
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import org.thoughtcrime.securesms.conversation.ConversationAdapter
import kotlin.math.min import kotlin.math.min
/** /**
@ -21,8 +22,19 @@ class GiphyMp4ItemDecoration(val callback: GiphyMp4PlaybackController.Callback)
if (parent.childCount == 0 || parent.canScrollVertically(-1) || parent.canScrollVertically(1)) { if (parent.childCount == 0 || parent.canScrollVertically(-1) || parent.canScrollVertically(1)) {
parent.translationY = 0f parent.translationY = 0f
} else { } else {
val childTop = parent.children.last().top val footerViewHolder = parent.children
parent.translationY = min(0, -childTop).toFloat() .map { parent.getChildViewHolder(it) }
.filterIsInstance(ConversationAdapter.FooterViewHolder::class.java)
.firstOrNull()
if (footerViewHolder == null) {
parent.translationY = 0f
return
}
val childTop = footerViewHolder.itemView.top
parent.translationY = min(0, -childTop).toFloat().also {
}
} }
} }
} }