diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java index 3f3b618e7b..dd576804fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java @@ -225,7 +225,7 @@ public class ConversationAdapter case MESSAGE_TYPE_HEADER: return new HeaderViewHolder(CachedInflater.from(parent.getContext()).inflate(R.layout.cursor_adapter_header_footer_view, parent, false)); 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: 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; @@ -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 { HeaderViewHolder(@NonNull View itemView) { super(itemView); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator.kt index 5b62f0beac..66d871df3c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator.kt @@ -45,7 +45,8 @@ class ConversationItemAnimator( if (viewHolder is ConversationAdapter.HeaderViewHolder && !pendingSlideAnimations.containsKey(viewHolder) && !slideAnimations.containsKey(viewHolder) && - shouldPlayMessageAnimations() + shouldPlayMessageAnimations() && + isParentFilled() ) { pendingSlideAnimations[viewHolder] = TweeningInfo(0f, viewHolder.itemView.height.toFloat()) dispatchAnimationStarted(viewHolder) @@ -71,7 +72,7 @@ class ConversationItemAnimator( return false } - if (operation == Operation.CHANGE && !isParentFilled() || slideAnimations.containsKey(viewHolder)) { + if (operation == Operation.CHANGE || slideAnimations.containsKey(viewHolder)) { dispatchAnimationFinished(viewHolder) return false } @@ -100,8 +101,7 @@ class ConversationItemAnimator( } override fun animatePersistence(viewHolder: RecyclerView.ViewHolder, preLayoutInfo: ItemHolderInfo, postLayoutInfo: ItemHolderInfo): Boolean { - val isInMultiSelectMode = isInMultiSelectMode() - return if (!isInMultiSelectMode && shouldPlayMessageAnimations()) { + return if (!isInMultiSelectMode() && shouldPlayMessageAnimations() && isParentFilled()) { if (pendingSlideAnimations.contains(viewHolder) || slideAnimations.containsKey(viewHolder)) { dispatchAnimationFinished(viewHolder) false diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration.kt index 3762d77b5b..cc10be6b4d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.giph.mp4 import android.graphics.Canvas import androidx.core.view.children import androidx.recyclerview.widget.RecyclerView +import org.thoughtcrime.securesms.conversation.ConversationAdapter import kotlin.math.min /** @@ -21,8 +22,19 @@ class GiphyMp4ItemDecoration(val callback: GiphyMp4PlaybackController.Callback) if (parent.childCount == 0 || parent.canScrollVertically(-1) || parent.canScrollVertically(1)) { parent.translationY = 0f } else { - val childTop = parent.children.last().top - parent.translationY = min(0, -childTop).toFloat() + val footerViewHolder = parent.children + .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 { + } } } }