Fix issue 1031 (chat message status icon not updated if it's not the last one sent)

This commit is contained in:
Sylvain Berfini 2013-11-29 11:55:26 +01:00
parent 24bf8520ed
commit cd7c95ce72
2 changed files with 59 additions and 16 deletions

View file

@ -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<BubbleChat> lastSentMessagesBubbles;
private HashMap<Integer, String> 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<BubbleChat>();
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<BubbleChat>();
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());
}
}
}
}
});

View file

@ -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;
}
}