diff --git a/src/org/linphone/ChatFragment.java b/src/org/linphone/ChatFragment.java index a1f27785b..fbdf084b1 100644 --- a/src/org/linphone/ChatFragment.java +++ b/src/org/linphone/ChatFragment.java @@ -111,7 +111,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC private LinphoneScrollView messagesScrollView; private int previousMessageID; private Handler mHandler = new Handler(); - private BubbleChat lastSentMessageBubble; + private List lastSentMessagesBubbles; private HashMap latestImageMessages; private int messagesFilterLimit = 0; private boolean useLinphoneMessageStorage; @@ -366,15 +366,17 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC return id; } - private void displayMessage(int id, String message, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout) { - displayMessage(id, message, time, isIncoming, status, layout, true); + private BubbleChat displayMessage(int id, String message, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout) { + return displayMessage(id, message, time, isIncoming, status, layout, true); } - private void displayMessage(int id, String message, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, boolean show) { + private BubbleChat displayMessage(int id, String message, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, boolean show) { id = checkId(id); BubbleChat bubble = new BubbleChat(layout.getContext(), id, message, null, time, isIncoming, status, null, previousMessageID); if (!isIncoming) { - lastSentMessageBubble = bubble; + if (lastSentMessagesBubbles == null) + lastSentMessagesBubbles = new ArrayList(); + lastSentMessagesBubbles.add(bubble); } View v = bubble.getView(); @@ -385,16 +387,21 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC previousMessageID = id; layout.addView(v); registerForContextMenu(v); - } - private void displayImageMessage(int id, Bitmap image, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, final String url) { - displayImageMessage(id, image, time, isIncoming, status, layout, url, true); + + return bubble; } - private void displayImageMessage(int id, Bitmap image, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, final String url, boolean show) { + private BubbleChat displayImageMessage(int id, Bitmap image, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, final String url) { + return displayImageMessage(id, image, time, isIncoming, status, layout, url, true); + } + + private BubbleChat displayImageMessage(int id, Bitmap image, long time, boolean isIncoming, LinphoneChatMessage.State status, RelativeLayout layout, final String url, boolean show) { id = checkId(id); final BubbleChat bubble = new BubbleChat(layout.getContext(), id, null, image, time, isIncoming, status, url, previousMessageID); if (!isIncoming) { - lastSentMessageBubble = bubble; + if (lastSentMessagesBubbles == null) + lastSentMessagesBubbles = new ArrayList(); + lastSentMessagesBubbles.add(bubble); } final View v = bubble.getView(); @@ -457,6 +464,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC previousMessageID = id; layout.addView(v); registerForContextMenu(v); + + return bubble; } public void changeDisplayedChat(String newSipUri, String displayName, String pictureUri) { @@ -601,7 +610,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC newId = LinphoneActivity.instance().onMessageSent(sipUri, messageToSend); } - displayMessage(newId, messageToSend, System.currentTimeMillis(), false, State.InProgress, messagesLayout); + BubbleChat bubble = displayMessage(newId, messageToSend, System.currentTimeMillis(), false, State.InProgress, messagesLayout); + bubble.setNativeMessageObject(chatMessage); scrollToEnd(); } else if (!isNetworkReachable && LinphoneActivity.isInstanciated()) { LinphoneActivity.instance().displayCustomToast(getString(R.string.error_network_unreachable), Toast.LENGTH_LONG); @@ -627,7 +637,8 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC if (useLinphoneMessageStorage) url = saveImage(bitmap, newId, chatMessage); - displayImageMessage(newId, bitmap, System.currentTimeMillis(), false, State.InProgress, messagesLayout, url); + BubbleChat bubble = displayImageMessage(newId, bitmap, System.currentTimeMillis(), false, State.InProgress, messagesLayout, url); + bubble.setNativeMessageObject(chatMessage); scrollToEnd(); } else if (!isNetworkReachable && LinphoneActivity.isInstanciated()) { LinphoneActivity.instance().displayCustomToast(getString(R.string.error_network_unreachable), Toast.LENGTH_LONG); @@ -681,7 +692,7 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } @Override - public void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state) { + public synchronized void onLinphoneChatMessageStateChanged(LinphoneChatMessage msg, State state) { final String finalMessage = msg.getText(); final String finalImage = msg.getExternalBodyUrl(); final State finalState = state; @@ -706,8 +717,13 @@ public class ChatFragment extends Fragment implements OnClickListener, LinphoneC } } } - if (lastSentMessageBubble != null) { - lastSentMessageBubble.updateStatusView(finalState); + + if (lastSentMessagesBubbles != null && lastSentMessagesBubbles.size() > 0) { + for (BubbleChat bubble : lastSentMessagesBubbles) { + if (bubble.getStatus() == State.InProgress || bubble.getStatus() == State.Idle) { + bubble.updateStatusView(bubble.getNativeMessageObject().getStatus()); + } + } } } }); diff --git a/src/org/linphone/ui/BubbleChat.java b/src/org/linphone/ui/BubbleChat.java index 73af4b434..c84670635 100644 --- a/src/org/linphone/ui/BubbleChat.java +++ b/src/org/linphone/ui/BubbleChat.java @@ -25,6 +25,7 @@ import java.util.Map.Entry; import org.linphone.LinphoneUtils; import org.linphone.R; import org.linphone.core.LinphoneChatMessage; +import org.linphone.core.LinphoneChatMessage.State; import android.annotation.SuppressLint; import android.content.Context; @@ -88,11 +89,15 @@ public class BubbleChat { private RelativeLayout view; private ImageView statusView; private Button downloadOrShow; - private String imageUrl; + private String imageUrl, textMessage; + private LinphoneChatMessage.State state; + private LinphoneChatMessage nativeMessage; public BubbleChat(final Context context, int id, String message, Bitmap image, long time, boolean isIncoming, LinphoneChatMessage.State status, String url, int previousID) { view = new RelativeLayout(context); imageUrl = url; + textMessage = message; + state = status; LayoutParams layoutParams = new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); @@ -198,6 +203,8 @@ public class BubbleChat { } public void updateStatusView(LinphoneChatMessage.State status) { + state = status; + if (statusView == null) { return; } @@ -298,4 +305,24 @@ public class BubbleChat { public void updateUrl(String newFileUrl) { imageUrl = newFileUrl; } + + public String getTextMessage() { + return textMessage; + } + + public String getImageUrl() { + return imageUrl; + } + + public State getStatus() { + return state; + } + + public LinphoneChatMessage getNativeMessageObject() { + return nativeMessage; + } + + public void setNativeMessageObject(LinphoneChatMessage message) { + nativeMessage = message; + } }