Fixed issue with file transfer messages not being updated

This commit is contained in:
Sylvain Berfini 2018-11-28 11:12:04 +01:00
parent 7370712dc3
commit d2198518cc
4 changed files with 30 additions and 14 deletions

View file

@ -217,7 +217,7 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi
for (Content c : fileContents) {
View content = LayoutInflater.from(mContext).inflate(R.layout.chat_bubble_content, null, false);
if (c.isFile()) {
if (c.isFile() || (c.isFileTransfer() && message.isOutgoing())) { // If message is outgoing, even if content is file transfer we have the file available
String filePath = c.getFilePath();
View v;
@ -260,13 +260,6 @@ public class ChatMessageViewHolder extends RecyclerView.ViewHolder implements Vi
message.downloadContent(c);
}
});
message.setListener(new ChatMessageListenerStub() {
@Override
public void onMsgStateChanged(ChatMessage msg, ChatMessage.State state) {
//TODO: invalidate
}
});
} else {
Log.w("WRITE_EXTERNAL_STORAGE permission not granted, won't be able to store the downloaded file");
LinphoneActivity.instance().checkAndRequestExternalStoragePermission();

View file

@ -25,6 +25,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import org.linphone.mediastream.Log;
import org.linphone.utils.LinphoneUtils;
import org.linphone.R;
import org.linphone.contacts.ContactsManager;
@ -50,6 +51,8 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
private int mItemResource;
private ChatMessagesFragment mFragment;
private List<ChatMessage> mTransientMessages;
private ChatMessageViewHolderClickListener mClickListener;
public ChatMessagesAdapter(ChatMessagesFragment fragment, SelectableHelper helper, int itemResource, EventLog[] history, ArrayList<LinphoneContact> participants, ChatMessageViewHolderClickListener clickListener) {
@ -61,6 +64,7 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
Collections.reverse(mHistory);
mParticipants = participants;
mClickListener = clickListener;
mTransientMessages = new ArrayList<>();
}
@Override
@ -76,7 +80,7 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
}
@Override
public void onBindViewHolder(@NonNull final ChatMessageViewHolder holder, int position) {
public void onBindViewHolder(@NonNull ChatMessageViewHolder holder, int position) {
EventLog event = mHistory.get(position);
holder.deleteEvent.setVisibility(View.GONE);
@ -89,7 +93,6 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
if (event.getType() == EventLog.Type.ConferenceChatMessage) {
ChatMessage message = event.getChatMessage();
message.setUserData(holder);
if (isEditionEnabled()) {
holder.deleteMessage.setVisibility(View.VISIBLE);
@ -97,13 +100,23 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
holder.deleteMessage.setTag(position);
}
if (message.isOutgoing() && message.getState() != ChatMessage.State.Displayed) {
if ((message.isOutgoing() && message.getState() != ChatMessage.State.Displayed) || (!message.isOutgoing() && message.isFileTransfer())) {
if (!mTransientMessages.contains(message)) {
mTransientMessages.add(message);
}
message.setUserData(holder); // This only works if JAVA object is kept, hence the transient list
message.setListener(new ChatMessageListenerStub() {
@Override
public void onMsgStateChanged(ChatMessage message, ChatMessage.State state) {
ChatMessageViewHolder holder = (ChatMessageViewHolder) message.getUserData();
if (holder != null) {
notifyItemChanged(holder.getAdapterPosition());
} else {
// Just in case, better to refresh the whole view than to miss an update
notifyDataSetChanged();
}
if (state == ChatMessage.State.Displayed) {
mTransientMessages.remove(message);
}
}
});
@ -244,6 +257,7 @@ public class ChatMessagesAdapter extends SelectableAdapter<ChatMessageViewHolder
message.setListener(null);
}
}
mTransientMessages.clear();
mHistory.clear();
}

View file

@ -57,6 +57,7 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import org.linphone.LinphoneManager;
import org.linphone.core.ChatMessageListenerStub;
import org.linphone.settings.LinphonePreferences;
import org.linphone.LinphoneService;
import org.linphone.utils.FileUtils;
@ -900,6 +901,10 @@ public class ChatMessagesFragment extends Fragment implements ChatRoomListener,
private void sendMessage() {
ChatMessage msg = mChatRoom.createEmptyMessage();
String text = mMessageTextToSend.getText().toString();
boolean hasText = text != null && text.length() > 0;
for (int i = 0; i < mFilesUploadLayout.getChildCount(); i++) {
String filePath = (String) mFilesUploadLayout.getChildAt(i).getTag();
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
@ -914,7 +919,8 @@ public class ChatMessagesFragment extends Fragment implements ChatRoomListener,
content.setName(fileName);
content.setFilePath(filePath); // Let the file body handler take care of the upload
if (getResources().getBoolean(R.bool.send_text_and_images_as_different_messages)) {
if (getResources().getBoolean(R.bool.send_text_and_images_as_different_messages)
&& (mFilesUploadLayout.getChildCount() > 1 || hasText)) {
ChatMessage fileMessage = mChatRoom.createFileTransferMessage(content);
fileMessage.send();
} else {
@ -922,8 +928,7 @@ public class ChatMessagesFragment extends Fragment implements ChatRoomListener,
}
}
String text = mMessageTextToSend.getText().toString();
if (text != null && text.length() > 0) {
if (hasText) {
msg.addTextContent(text);
}

View file

@ -136,6 +136,10 @@ public class ImdnFragment extends Fragment {
}
private void refreshInfo() {
if (mMessage == null) {
//TODO: error
return;
}
Address remoteSender = mMessage.getFromAddress();
LinphoneContact contact = ContactsManager.getInstance().findContactFromAddress(remoteSender);