kopia lustrzana https://github.com/ryukoposting/Signal-Android
Fix flashing when send/recv messages in a new conversation.
rodzic
b92a41ab70
commit
4f3c545eda
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Ładowanie…
Reference in New Issue