From 89af85c893b5ffd3190926a56e7d39568b8b0caf Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 6 Aug 2021 16:37:33 -0300 Subject: [PATCH] Fix MP4 Gif crash with ConversationUpdateItem Due to adapter positions changing due to deletes and other such nonsense, there are cases where update items are all of a sudden in our playing or notplaying arrays. Checking for playable content before trying to update positioning information seems to have fixed the issue. --- .../conversation/ConversationFragment.java | 2 +- .../giph/mp4/GiphyMp4ProjectionRecycler.java | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) 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 51eed9cb5..c0c42accc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -512,7 +512,7 @@ public class ConversationFragment extends LoggingFragment { private void onViewHolderPositionTranslated(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { if (viewHolder instanceof GiphyMp4Playable) { - giphyMp4ProjectionRecycler.updateDisplay(recyclerView, (GiphyMp4Playable) viewHolder); + giphyMp4ProjectionRecycler.updateVideoDisplayPositionAndSize(recyclerView, (GiphyMp4Playable) viewHolder); } if (colorizer != null) { 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 72b6141c0..9a241e309 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 @@ -46,14 +46,14 @@ public final class GiphyMp4ProjectionRecycler implements GiphyMp4PlaybackControl } for (final GiphyMp4Playable holder : holders) { - updateDisplay(recyclerView, holder); + updateVideoDisplayPositionAndSize(recyclerView, holder); } } - public void updateDisplay(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4Playable holder) { + public void updateVideoDisplayPositionAndSize(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4Playable holder) { GiphyMp4ProjectionPlayerHolder playerHolder = getCurrentHolder(holder.getAdapterPosition()); if (playerHolder != null) { - updateDisplay(recyclerView, playerHolder, holder); + updateVideoDisplayPositionAndSize(recyclerView, playerHolder, holder); } } @@ -84,7 +84,14 @@ public final class GiphyMp4ProjectionRecycler implements GiphyMp4PlaybackControl } } - private void updateDisplay(@NonNull RecyclerView recyclerView, @NonNull GiphyMp4ProjectionPlayerHolder holder, @NonNull GiphyMp4Playable giphyMp4Playable) { + private void updateVideoDisplayPositionAndSize(@NonNull RecyclerView recyclerView, + @NonNull GiphyMp4ProjectionPlayerHolder holder, + @NonNull GiphyMp4Playable giphyMp4Playable) + { + if (!giphyMp4Playable.canPlayContent()) { + return; + } + Projection projection = giphyMp4Playable.getGiphyMp4PlayableProjection(recyclerView); holder.getContainer().setX(projection.getX());