Last active
July 15, 2016 03:26
-
-
Save protoss1010/e785e892a33bf626a3fb31d2a3f57526 to your computer and use it in GitHub Desktop.
setHistoryMessageRead
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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