diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index cee4c84f0b..a09bf55a47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -101,6 +101,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.database.model.ReactionRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ItemDecoration; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Playable; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackController; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicy; @@ -366,6 +367,7 @@ public class ConversationFragment extends LoggingFragment implements Multiselect GiphyMp4ProjectionRecycler callback = new GiphyMp4ProjectionRecycler(holders); GiphyMp4PlaybackController.attach(list, callback, maxPlayback); + list.addItemDecoration(new GiphyMp4ItemDecoration(callback), 0); return callback; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 4c1ebaf011..c2e25bc79a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -1715,10 +1715,12 @@ public final class ConversationItem extends RelativeLayout implements BindableCo public @NonNull Projection getGiphyMp4PlayableProjection(@NonNull ViewGroup recyclerView) { if (mediaThumbnailStub != null && mediaThumbnailStub.isResolvable()) { return Projection.relativeToParent(recyclerView, mediaThumbnailStub.require(), mediaThumbnailStub.require().getCorners()) + .translateY(getTranslationY()) .translateX(bodyBubble.getTranslationX()) .translateX(getTranslationX()); } else { return Projection.relativeToParent(recyclerView, bodyBubble, bodyBubbleCorners) + .translateY(getTranslationY()) .translateX(bodyBubble.getTranslationX()) .translateX(getTranslationX()); } 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 new file mode 100644 index 0000000000..3ff30c9209 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration.kt @@ -0,0 +1,16 @@ +package org.thoughtcrime.securesms.giph.mp4 + +import android.graphics.Canvas +import androidx.core.view.children +import androidx.recyclerview.widget.RecyclerView + +/** + * Decoration that will make the video display params update on each recycler redraw. + */ +class GiphyMp4ItemDecoration(val callback: GiphyMp4PlaybackController.Callback) : RecyclerView.ItemDecoration() { + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + parent.children.map { parent.getChildViewHolder(it) }.filterIsInstance(GiphyMp4Playable::class.java).forEach { + callback.updateVideoDisplayPositionAndSize(parent, it) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController.java b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController.java index f261823f07..5eec67ada6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.giph.mp4; +import android.graphics.Canvas; import android.view.View; import androidx.annotation.NonNull; @@ -43,16 +44,12 @@ public final class GiphyMp4PlaybackController extends RecyclerView.OnScrollListe @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { - enqueuePlaybackUpdate(recyclerView); + performPlaybackUpdate(recyclerView); } @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { RecyclerView recyclerView = (RecyclerView) v; - enqueuePlaybackUpdate(recyclerView); - } - - private void enqueuePlaybackUpdate(@NonNull RecyclerView recyclerView) { performPlaybackUpdate(recyclerView); } @@ -126,8 +123,9 @@ public final class GiphyMp4PlaybackController extends RecyclerView.OnScrollListe } } - interface Callback { + public interface Callback { void update(@NonNull RecyclerView recyclerView, @NonNull List holders, @NonNull Set playbackSet); + void updateVideoDisplayPositionAndSize(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4Playable holder); } @VisibleForTesting diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler.java b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler.java index e77f8d659c..d40f33af4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler.java @@ -50,6 +50,7 @@ public final class GiphyMp4ProjectionRecycler implements GiphyMp4PlaybackControl } } + @Override public void updateVideoDisplayPositionAndSize(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4Playable holder) { GiphyMp4ProjectionPlayerHolder playerHolder = getCurrentHolder(holder.getAdapterPosition()); if (playerHolder != null) { @@ -57,13 +58,6 @@ public final class GiphyMp4ProjectionRecycler implements GiphyMp4PlaybackControl } } - public @Nullable View getVideoPlayerAtAdapterPosition(int adapterPosition) { - GiphyMp4ProjectionPlayerHolder holder = getCurrentHolder(adapterPosition); - - if (holder != null) return holder.getContainer(); - else return null; - } - private void stopAndReleaseAssignedVideos(@NonNull Set playbackSet) { List markedForDeletion = new ArrayList<>(playing.size()); for (int i = 0; i < playing.size(); i++) {