From 62f2ebc2677b2e9ce44f8fa22b72ccebbc2bedd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Thu, 27 Aug 2020 15:22:07 -0400 Subject: [PATCH] conversation: avoid race-condition during file transfer Change-Id: I7a22363e61a0158dc043bce5f5f0175c868b12f1 --- .../cx/ring/adapters/ConversationAdapter.java | 53 +++++++++++-------- .../cx/ring/views/ConversationViewHolder.java | 2 + 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java index 8a0dcd3f4..e880e2b9c 100644 --- a/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java +++ b/ring-android/app/src/main/java/cx/ring/adapters/ConversationAdapter.java @@ -580,7 +580,8 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo @NonNull final Interaction interaction, int position) { DataTransfer file = (DataTransfer) interaction; File path = presenter.getDeviceRuntimeService().getConversationPath(file.getPeerId(), file.getStoragePath()); - file.setSize(path.length()); + if (file.isComplete()) + file.setSize(path.length()); String timeString = timestampToDetailString(viewHolder.itemView.getContext(), file.getTimestamp()); viewHolder.compositeDisposable.add(timestampUpdateTimer.subscribe(t -> { @@ -594,21 +595,8 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo } })); - TransferMsgType type; - if (!file.isComplete()) { - type = TransferMsgType.FILE; - } else if (file.isPicture()) { - type = TransferMsgType.IMAGE; - } else if (file.isAudio()) { - type = TransferMsgType.AUDIO; - } else if (file.isVideo()) { - type = TransferMsgType.VIDEO; - } else { - type = TransferMsgType.FILE; - } - + TransferMsgType type = viewHolder.type.getTransferType(); viewHolder.compositeDisposable.clear(); - if (hasPermanentTimeString(file, position)) { viewHolder.compositeDisposable.add(timestampUpdateTimer.subscribe(t -> { String timeSeparationString = timestampToDetailString(viewHolder.itemView.getContext(), file.getTimestamp()); @@ -651,6 +639,9 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo viewHolder.mImage : (type == TransferMsgType.VIDEO) ? viewHolder.video : (type == TransferMsgType.AUDIO) ? viewHolder.mAudioInfoLayout : viewHolder.mFileInfoLayout; + if (longPressView == null) { + return; + } if (type == TransferMsgType.AUDIO || type == TransferMsgType.FILE) { longPressView.getBackground().setTintList(null); } @@ -1163,6 +1154,12 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo SINGLE; } + private enum TransferMsgType { + FILE, + IMAGE, + AUDIO, + VIDEO; + } public enum MessageType { INCOMING_FILE(R.layout.item_conv_file_peer), INCOMING_IMAGE(R.layout.item_conv_image_peer), @@ -1183,12 +1180,26 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationViewHo MessageType(int l) { layout = l; } - } - private enum TransferMsgType { - FILE, - IMAGE, - AUDIO, - VIDEO; + boolean isFile() { + return this == INCOMING_FILE || this == OUTGOING_FILE; + } + boolean isAudio() { + return this == INCOMING_AUDIO || this == OUTGOING_AUDIO; + } + boolean isVideo() { + return this == INCOMING_VIDEO || this == OUTGOING_VIDEO; + } + boolean isImage() { + return this == INCOMING_IMAGE || this == OUTGOING_IMAGE; + } + + public TransferMsgType getTransferType() { + return isFile() ? TransferMsgType.FILE + : (isImage() ? TransferMsgType.IMAGE + : (isAudio() ? TransferMsgType.AUDIO + : (isVideo() ? TransferMsgType.VIDEO : TransferMsgType.FILE))); + } } + } diff --git a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java index 647eb9c21..de764a619 100644 --- a/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java +++ b/ring-android/app/src/main/java/cx/ring/views/ConversationViewHolder.java @@ -39,6 +39,7 @@ import cx.ring.utils.UiUpdater; import io.reactivex.disposables.CompositeDisposable; public class ConversationViewHolder extends RecyclerView.ViewHolder { + public ConversationAdapter.MessageType type; public View mItem; public TextView mMsgTxt; public TextView mMsgDetailTxt; @@ -66,6 +67,7 @@ public class ConversationViewHolder extends RecyclerView.ViewHolder { public ConversationViewHolder(ViewGroup v, ConversationAdapter.MessageType type) { super(v); + this.type = type; if (type == ConversationAdapter.MessageType.CONTACT_EVENT) { mMsgTxt = v.findViewById(R.id.contact_event_txt); mMsgDetailTxt = v.findViewById(R.id.contact_event_details_txt); -- GitLab