Skip to content

Instantly share code, notes, and snippets.

@protoss1010
Last active July 15, 2016 03:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save protoss1010/e785e892a33bf626a3fb31d2a3f57526 to your computer and use it in GitHub Desktop.
Save protoss1010/e785e892a33bf626a3fb31d2a3f57526 to your computer and use it in GitHub Desktop.
setHistoryMessageRead
package tw.com.fet.ecs.xmpp.level1.thread.readinputstream.factory;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import com.fetnet.libfetnet.Log;
import com.hiiir.toolkit.debug.HrLog;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smackx.packet.DelayInformation;
import org.json.JSONArray;
import java.util.List;
import tw.com.fet.ecs.BaseApplication;
import tw.com.fet.ecs.Const;
import tw.com.fet.ecs.manager.AccountManager;
import tw.com.fet.ecs.manager.ChatRoomManager;
import tw.com.fet.ecs.manager.MemberManager;
import tw.com.fet.ecs.manager.MessageManager;
import tw.com.fet.ecs.manager.PacketExtension.AdditionTime;
import tw.com.fet.ecs.manager.VoiceManager;
import tw.com.fet.ecs.modle.ChatRoom;
import tw.com.fet.ecs.modle.Member;
import tw.com.fet.ecs.xmpp.history.ChatHistory;
/**
* Created by terry_wang on 2016/1/12.
*/
public abstract class BaseXmppMessageHandler {
private static final String TAG = BaseXmppMessageHandler.class.getSimpleName();
public abstract boolean handleMessage(Message message);
void readBody(Message message, String from, String roomId) {
String body = message.getBody();
if (body == null) return;
// repack org.jivesoftware.smack.packet.Message to tw.com.fet.ecs.modle.Message
tw.com.fet.ecs.modle.Message newMessage = repackMessageToOurMessage(message, from, roomId, body);
if (newMessage == null) return;
if (Const.EN_XMPP_V2) {
if (from == null) {
Log.d(TAG, "No from, skip msg=%s", newMessage.toString());
return;
}
}
/**
* *****如果沒有這個聯絡人的話就新增一個******
*/
String peerEjabberId = newMessage.getMessageFrom();
addMemberIfNotExist(peerEjabberId);
// 如果該message tag是voice,在voice table增加得到的duration及content_length
if (newMessage.getTag().equals(tw.com.fet.ecs.modle.Message.TAG_VOICE)) {
boolean updateVoiceResult = VoiceManager.getInstance().addVoice(newMessage.getMessageId(), body);
HrLog.d(TAG, "updateVoiceResult: " + updateVoiceResult);
}
if (!tw.com.fet.ecs.modle.Message.TAG_EVENT.equals(newMessage.getTag())) {
// issue: 需降低此處負擔 15/4/1 已嘗試降低負擔
String newRoomId = newMessage.getRoomId(); //AL-02-03+
ChatRoomManager.getInstance().addChatMember(newMessage.getRoomId(), getTargetId(newMessage));
if(newRoomId.contains("@conference"))
ChatRoomManager.getInstance().setChatRoomHide(newRoomId, ChatRoom.DEL_NORMAL); //AL-v2-03+
Log.d(TAG, "after add to chatroom, roomId=%s", newRoomId);
}
HrLog.d(TAG, "newMessage, from: " + newMessage.getMessageFrom());
MessageManager.getInstance().receiveMessage(newMessage);
HrLog.d(TAG, "after receiver message");
}
private void addMemberIfNotExist(String peerEjabberId) {
Member member = MemberManager.getInstance().getMemberByEjabberdId(peerEjabberId);
HrLog.d(TAG, "scan member from db");
if (member == null) {
HrLog.d(TAG, "peer member not found! adding now: " + peerEjabberId);
member = new Member();
member.setMemberId("");
member.setDisplayName("");
member.setEjabberdLogin(peerEjabberId);
member.setFavor(false);
member.setSync(false);
member.setDelete(false);
member.setGroup(false);
member.setFromSyncContactDB(false);
MemberManager.getInstance().addMember(member);
HrLog.d(TAG, "after add new member");
}
}
@Nullable
public tw.com.fet.ecs.modle.Message repackMessageToOurMessage(Message message, String from, String roomId, String body) { //AL-v2-02*
tw.com.fet.ecs.modle.Message newMessage = MessageManager.toObject(body);
HrLog.d(TAG, "message body toObject");
if (newMessage == null) return null;
newMessage.setMessageId(message.getPacketID());
newMessage.setRoomId(roomId);
newMessage.setMessageTo(message.getTo().split("/")[0]);
newMessage.setMessageFrom(from);
newMessage.setSendStatus(tw.com.fet.ecs.modle.Message.STATUS_SUCCESS);
newMessage.setReaders(new JSONArray());
if (roomId.contains("@conference"))
newMessage.setGroup(tw.com.fet.ecs.modle.Message.GROUP);
else
newMessage.setGroup(tw.com.fet.ecs.modle.Message.NOT_GROUP);
if (isFromMyOtherDevice(from)) {
newMessage.setReadStatus(tw.com.fet.ecs.modle.Message.STATUS_READ_SUCCESS);
}
if (Const.EN_XMPP_V2) {
// Get message timestamp
DelayInformation delayInformation = (DelayInformation) message.getExtension(DelayInformation.ELEMENT_NAME, DelayInformation.NAMESPACE);
if (delayInformation != null) {
long time = delayInformation.getStamp().getTime();
newMessage.setTimeStamp(String.valueOf(time));
} else {
// If cant get message timestamp use local timestamp
newMessage.setTimeStamp(String.valueOf(System.currentTimeMillis()));
}
} else {
// 使用server的時間當作顯示時間
AdditionTime additionTime = (AdditionTime) message.getExtension(AdditionTime.NAMESPACE);
if (additionTime != null && additionTime.getTime().length() > 3) {
HrLog.d(TAG, "AdditionTime test: " + additionTime.getTime());
newMessage.setTimeStamp(additionTime.getTime());
} else {
newMessage.setTimeStamp(String.valueOf(System.currentTimeMillis()));
}
}
HrLog.d(TAG, "message constructor");
if (message.isHistoryMessage()) {
setHistoryMessageRead(newMessage);
}
return newMessage;
}
private void setHistoryMessageRead(tw.com.fet.ecs.modle.Message historyMessage) {
List<Message> emmaDisplayedMessages = ChatHistory.getEmmaDisplayedMessages();
historyMessage.setHistory(tw.com.fet.ecs.modle.Message.FROM_HISTORY);
JSONArray readerArray = new JSONArray();
for (org.jivesoftware.smack.packet.Message emmaMessage : emmaDisplayedMessages) {
boolean roomMessage = historyMessage.getRoomId().equals(emmaMessage.getFrom());
if (roomMessage) {
for (org.jivesoftware.smack.packet.Message.EmmaDisplayed emmaDisplayed : emmaMessage.getEmmaDisplayeds()) {
String myJid = PreferenceManager.getDefaultSharedPreferences(BaseApplication.getContext()).getString(Const.USER_EID, "");
boolean myselfEmmaDisplayed = emmaDisplayed.isMyself(myJid);
long historyMessageTime = Long.parseLong(historyMessage.getTimeStamp());
long emmaDisplayedTime = Long.parseLong(emmaDisplayed.getTime());
if (myselfEmmaDisplayed) {
// Chat room left message
if (emmaDisplayed.getJid().equals(historyMessage.getMessageTo())) {
if (historyMessageTime <= emmaDisplayedTime) {
historyMessage.setReadStatus(tw.com.fet.ecs.modle.Message.STATUS_READ_SUCCESS);
}
}
} else {
// Chat room right message
if (emmaDisplayed.getJid().equals(historyMessage.getMessageTo())) {
if (historyMessageTime <= emmaDisplayedTime) {
historyMessage.setReadStatus(tw.com.fet.ecs.modle.Message.STATUS_READ_SUCCESS);
Member member = MemberManager.getInstance().getMemberByEjabberdId(historyMessage.getMessageFrom());
JSONArray reader = new JSONArray();
if (member != null) {
// 若db有該成員的資料,將其撈出後加入至readerArray
reader.put(member.getDisplayName());
} else {
reader.put("");
}
reader.put(historyMessage.getMessageFrom());
readerArray.put(reader);
historyMessage.setReaders(readerArray);
}
}
}
Log.d(TAG, String.format("Update history unreadMessage to read status MessageId=%s, Reader=%s", historyMessage.getMessageId(), historyMessage.getReaders()));
}
}
}
}
protected boolean isFromMyOtherDevice(String messageFrom) {
Member myself = MemberManager.getInstance().getMemberById(AccountManager.getInstance().getUid());
String myEjabberId;
if (Const.EN_XMPP_V2)
if (myself.getEjabberdLogin().contains("@"))
myEjabberId = myself.getEjabberdLogin().split("@")[0]; // Nickname (without domain)
else
myEjabberId = myself.getEjabberdLogin();
else
myEjabberId = myself.getEjabberdLogin();
return messageFrom.contains(myEjabberId);
}
public String getTargetId(tw.com.fet.ecs.modle.Message newMessage) { // AL-v2-02*
return isFromMyOtherDevice(newMessage.getMessageFrom()) ? newMessage.getMessageTo() : newMessage.getMessageFrom();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment