package jimmui.updater;
import jimm.Jimm;
import jimm.Options;
import jimm.comm.StringUtils;
import jimmui.view.chat.Chat;
import jimmui.model.chat.ChatModel;
import jimmui.model.chat.MessData;
import jimm.chat.message.Message;
import jimm.chat.message.PlainMessage;
import jimm.history.HistoryStorage;
import jimm.history.HistoryStorageList;
import jimm.io.Storage;
import jimmui.view.base.GraphicsEx;
import protocol.Contact;
import protocol.Protocol;
import protocol.xmpp.XmppServiceContact;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.util.Vector;
/**
* Created with IntelliJ IDEA.
* <p/>
* Date: 02.07.13 23:18
*
* @author vladimir
*/
public class ChatUpdater {
public ChatModel createModel(Protocol p, Contact contact) {
ChatModel chat;
synchronized (Jimm.getJimm().jimmModel.chats) {
chat = Jimm.getJimm().jimmModel.getChatModel(contact);
if (null != chat) {
return chat;
}
chat = new ChatModel();
chat.protocol = p;
chat.contact = contact;
chat.fontSet = GraphicsEx.chatFontSet;
Jimm.getJimm().jimmModel.registerChat(chat);
}
// #sijapp cond.if modules_HISTORY is "true" #
new MessageBuilder().fillFromHistory(chat);
// #sijapp cond.end #
return chat;
}
public void addMessage(ChatModel chat, Message message, boolean toHistory) {
new MessageBuilder().addMessage(chat, message, toHistory);
}
public void addMyMessage(ChatModel chat, PlainMessage plainMsg) {
new MessageBuilder().addMyMessage(chat, plainMsg);
}
// #sijapp cond.if modules_FILES="true"#
public MessData addFileProgress(ChatModel chat, String caption, String text) {
return new MessageBuilder().addFileProgress(chat, caption, text);
}
public void changeFileProgress(ChatModel chat, MessData mData, String caption, String text) {
new MessageBuilder().changeFileProgress(chat, mData, caption, text);
}
// #sijapp cond.end#
public void activate(ChatModel chat) {
Chat view = Jimm.getJimm().getCL().getOrCreateChat(chat);
view.activate();
}
public void invalidate(ChatModel chat) {
Chat view = Jimm.getJimm().getCL().getChat(chat);
if (null != view) {
view.invalidate();
}
}
public void removeReadMessages(ChatModel chat) {
removeMessages(chat, chat.getUnreadMessageCount());
}
public void writeMessage(ChatModel chat, String message) {
Chat view = Jimm.getJimm().getCL().getOrCreateChat(chat);
view.writeMessage(message);
}
public void writeMessage(Protocol protocol, Contact contact, String message) {
ChatModel chat = Jimm.getJimm().jimmModel.getChatModel(contact);
if (null == chat) chat = createModel(protocol, contact);
writeMessage(chat, message);
}
public void writeMessageTo(Protocol protocol, XmppServiceContact conference, String nick) {
ChatModel chat = Jimm.getJimm().jimmModel.getChatModel(conference);
if (null == chat) chat = createModel(protocol, conference);
Chat view = Jimm.getJimm().getCL().getOrCreateChat(chat);
view.writeMessageTo(nick);
}
public void showHistory(Contact contact) {
HistoryStorage history = HistoryStorage.getHistory(contact);
// #sijapp cond.if modules_ANDROID is "true" #
ru.net.jimm.JimmActivity.getInstance().externalApi.showHistory(history);
// #sijapp cond.else #
new HistoryStorageList(history).show();
// #sijapp cond.end #
}
public void typing(ChatModel chat, boolean type) {
Chat view = Jimm.getJimm().getCL().getChat(chat);
if (null != view) {
view.beginTyping(type);
}
}
public void removeOldMessages(ChatModel chat) {
removeMessages(chat, Options.getInt(Options.OPTION_MAX_MSG_COUNT));
}
public void removeMessagesAtCursor(ChatModel model) {
restoreTopPositionToUI(model, Jimm.getJimm().getCL().getChat(model));
removeMessages(model, model.size() - model.current - 1);
}
private void removeMessages(ChatModel chat, int limit) {
if (chat.size() < limit) {
return;
}
if ((0 < limit) && (0 < chat.size())) {
while (limit < chat.size()) {
if (-1 < chat.bottomOffset) {
chat.bottomOffset = Math.max(0, chat.bottomOffset - chat.getItemHeight(chat.getMessage(0)));
}
chat.current = Math.max(0, chat.current - 1);
chat.removeTopMessage();
}
restoreTopPositionToUI(chat, Jimm.getJimm().getCL().getChat(chat));
invalidate(chat);
} else {
Jimm.getJimm().jimmModel.unregisterChat(chat);
}
}
public void restoreTopPositionToUI(ChatModel chat, Chat view) {
if (null != view) {
if (-1 == chat.bottomOffset) {
view.getContent().setCurrentItemToTop(chat.current);
} else {
view.getContent().setTopByOffset(chat.bottomOffset - view.getContentHeight());
view.getContent().setCurrentItemIndex(chat.current);
}
}
}
public void saveUnreadMessages() {
Storage s = new Storage("unread");
try {
s.delete();
s.open(true);
Vector<ChatModel> chats = Jimm.getJimm().jimmModel.chats;
for (int i = 0; i < chats.size(); ++i) {
ChatModel chat = (ChatModel) chats.elementAt(i);
if (!chat.getContact().isSingleUserContact()) {
continue;
}
if (chat.getContact().isTemp()) {
continue;
}
if (!chat.getContact().hasHistory()) {
continue;
}
int count = chat.getUnreadMessageCount();
for (int j = 0; j < count; ++j) {
MessData message = chat.getUnreadMessage(j);
ByteArrayOutputStream out = new ByteArrayOutputStream();
DataOutputStream o = new DataOutputStream(out);
o.writeUTF(chat.getProtocol().getUserId());
o.writeUTF(chat.getContact().getUserId());
o.writeUTF(message.getNick());
o.writeUTF(message.getText());
o.writeLong(message.getTime());
s.addRecord(out.toByteArray());
}
}
} catch (Exception ignored) {
}
s.close();
}
public void loadUnreadMessages() {
Storage s = new Storage("unread");
try {
s.open(false);
for (int i = 1; i <= s.getNumRecords(); ++i) {
DataInputStream in = new DataInputStream(new ByteArrayInputStream(s.getRecord(i)));
String account = in.readUTF();
String userId = in.readUTF();
String nick = in.readUTF();
String text = in.readUTF();
long time = in.readLong();
Protocol protocol = Jimm.getJimm().jimmModel.getProtocol(account);
if (null == protocol) {
continue;
}
PlainMessage msg = new PlainMessage(userId, protocol, time, text, true);
if (!StringUtils.isEmpty(nick)) {
msg.setName(nick);
}
protocol.addMessage(msg, true);
}
} catch (Exception ignored) {
}
s.close();
s.delete();
}
}