Search in sources :

Example 16 with Conversation

use of de.pixart.messenger.entities.Conversation in project Pix-Art-Messenger by kriztan.

the class XmppConnectionService method restoreFromDatabase.

private void restoreFromDatabase() {
    synchronized (this.conversations) {
        final Map<String, Account> accountLookupTable = new Hashtable<>();
        for (Account account : this.accounts) {
            accountLookupTable.put(account.getUuid(), account);
        }
        Log.d(Config.LOGTAG, "restoring conversations...");
        final long startTimeConversationsRestore = SystemClock.elapsedRealtime();
        this.conversations.addAll(databaseBackend.getConversations(Conversation.STATUS_AVAILABLE));
        for (Iterator<Conversation> iterator = conversations.listIterator(); iterator.hasNext(); ) {
            Conversation conversation = iterator.next();
            Account account = accountLookupTable.get(conversation.getAccountUuid());
            if (account != null) {
                conversation.setAccount(account);
            } else {
                Log.e(Config.LOGTAG, "unable to restore Conversations with " + conversation.getJid());
                iterator.remove();
            }
        }
        long diffConversationsRestore = SystemClock.elapsedRealtime() - startTimeConversationsRestore;
        Log.d(Config.LOGTAG, "finished restoring conversations in " + diffConversationsRestore + "ms");
        Runnable runnable = new Runnable() {

            @Override
            public void run() {
                long deletionDate = getAutomaticMessageDeletionDate();
                mLastExpiryRun.set(SystemClock.elapsedRealtime());
                if (deletionDate > 0) {
                    Log.d(Config.LOGTAG, "deleting messages that are older than " + AbstractGenerator.getTimestamp(deletionDate));
                    databaseBackend.expireOldMessages(deletionDate);
                }
                Log.d(Config.LOGTAG, "restoring roster...");
                for (Account account : accounts) {
                    databaseBackend.readRoster(account.getRoster());
                    // roster needs to be loaded at this stage
                    account.initAccountServices(XmppConnectionService.this);
                }
                getBitmapCache().evictAll();
                loadPhoneContacts();
                Log.d(Config.LOGTAG, "restoring messages...");
                final long startMessageRestore = SystemClock.elapsedRealtime();
                for (Conversation conversation : conversations) {
                    conversation.addAll(0, databaseBackend.getMessages(conversation, Config.PAGE_SIZE));
                    checkDeletedFiles(conversation);
                    conversation.findUnsentTextMessages(new Conversation.OnMessageFound() {

                        @Override
                        public void onMessageFound(Message message) {
                            markMessage(message, Message.STATUS_WAITING);
                        }
                    });
                    conversation.findUnreadMessages(new Conversation.OnMessageFound() {

                        @Override
                        public void onMessageFound(Message message) {
                            mNotificationService.pushFromBacklog(message);
                        }
                    });
                }
                mNotificationService.finishBacklog(false);
                restoredFromDatabaseLatch.countDown();
                final long diffMessageRestore = SystemClock.elapsedRealtime() - startMessageRestore;
                Log.d(Config.LOGTAG, "finished restoring messages in " + diffMessageRestore + "ms");
                updateConversationUi();
            }
        };
        // will contain one write command (expiry) but that's fine
        mDatabaseReaderExecutor.execute(runnable);
    }
}
Also used : Account(de.pixart.messenger.entities.Account) XmppAxolotlMessage(de.pixart.messenger.crypto.axolotl.XmppAxolotlMessage) Message(de.pixart.messenger.entities.Message) Hashtable(java.util.Hashtable) Conversation(de.pixart.messenger.entities.Conversation)

Example 17 with Conversation

use of de.pixart.messenger.entities.Conversation in project Pix-Art-Messenger by kriztan.

the class XmppConnectionService method persistSelfNick.

public void persistSelfNick(MucOptions.User self) {
    final Conversation conversation = self.getConversation();
    Jid full = self.getFullJid();
    if (!full.equals(conversation.getJid())) {
        Log.d(Config.LOGTAG, "nick changed. updating");
        conversation.setContactJid(full);
        databaseBackend.updateConversation(conversation);
    }
    Bookmark bookmark = conversation.getBookmark();
    if (bookmark != null && !full.getResourcepart().equals(bookmark.getNick())) {
        bookmark.setNick(full.getResourcepart());
        pushBookmarks(bookmark.getAccount());
    }
}
Also used : Jid(de.pixart.messenger.xmpp.jid.Jid) Bookmark(de.pixart.messenger.entities.Bookmark) Conversation(de.pixart.messenger.entities.Conversation)

Example 18 with Conversation

use of de.pixart.messenger.entities.Conversation in project Pix-Art-Messenger by kriztan.

the class XmppConnectionService method fetchAvatarVcard.

private void fetchAvatarVcard(final Account account, final Avatar avatar, final UiCallback<Avatar> callback) {
    IqPacket packet = this.mIqGenerator.retrieveVcardAvatar(avatar);
    this.sendIqPacket(account, packet, new OnIqPacketReceived() {

        @Override
        public void onIqPacketReceived(Account account, IqPacket packet) {
            synchronized (mInProgressAvatarFetches) {
                mInProgressAvatarFetches.remove(generateFetchKey(account, avatar));
            }
            if (packet.getType() == IqPacket.TYPE.RESULT) {
                Element vCard = packet.findChild("vCard", "vcard-temp");
                Element photo = vCard != null ? vCard.findChild("PHOTO") : null;
                String image = photo != null ? photo.findChildContent("BINVAL") : null;
                if (image != null) {
                    avatar.image = image;
                    if (getFileBackend().save(avatar)) {
                        Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": successfully fetched vCard avatar for " + avatar.owner);
                        if (avatar.owner.isBareJid()) {
                            if (account.getJid().toBareJid().equals(avatar.owner) && account.getAvatar() == null) {
                                Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": had no avatar. replacing with vcard");
                                account.setAvatar(avatar.getFilename());
                                databaseBackend.updateAccount(account);
                                getAvatarService().clear(account);
                                updateAccountUi();
                            } else {
                                Contact contact = account.getRoster().getContact(avatar.owner);
                                contact.setAvatar(avatar);
                                getAvatarService().clear(contact);
                                updateRosterUi();
                            }
                            updateConversationUi();
                        } else {
                            Conversation conversation = find(account, avatar.owner.toBareJid());
                            if (conversation != null && conversation.getMode() == Conversation.MODE_MULTI) {
                                MucOptions.User user = conversation.getMucOptions().findUserByFullJid(avatar.owner);
                                if (user != null) {
                                    if (user.setAvatar(avatar)) {
                                        getAvatarService().clear(user);
                                        updateConversationUi();
                                        updateMucRosterUi();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    });
}
Also used : Account(de.pixart.messenger.entities.Account) OnIqPacketReceived(de.pixart.messenger.xmpp.OnIqPacketReceived) Element(de.pixart.messenger.xml.Element) Conversation(de.pixart.messenger.entities.Conversation) IqPacket(de.pixart.messenger.xmpp.stanzas.IqPacket) Contact(de.pixart.messenger.entities.Contact)

Example 19 with Conversation

use of de.pixart.messenger.entities.Conversation in project Pix-Art-Messenger by kriztan.

the class PresenceParser method parseConferencePresence.

public void parseConferencePresence(PresencePacket packet, Account account) {
    final Conversation conversation = packet.getFrom() == null ? null : mXmppConnectionService.find(account, packet.getFrom().toBareJid());
    if (conversation != null) {
        final MucOptions mucOptions = conversation.getMucOptions();
        boolean before = mucOptions.online();
        int count = mucOptions.getUserCount();
        final List<MucOptions.User> tileUserBefore = mucOptions.getUsers(5);
        processConferencePresence(packet, conversation);
        final List<MucOptions.User> tileUserAfter = mucOptions.getUsers(5);
        if (!tileUserAfter.equals(tileUserBefore)) {
            mXmppConnectionService.getAvatarService().clear(mucOptions);
        }
        if (before != mucOptions.online() || (mucOptions.online() && count != mucOptions.getUserCount())) {
            mXmppConnectionService.updateConversationUi();
        } else if (mucOptions.online()) {
            mXmppConnectionService.updateMucRosterUi();
        }
    }
}
Also used : MucOptions(de.pixart.messenger.entities.MucOptions) Conversation(de.pixart.messenger.entities.Conversation)

Example 20 with Conversation

use of de.pixart.messenger.entities.Conversation in project Pix-Art-Messenger by kriztan.

the class MessageGenerator method preparePacket.

private MessagePacket preparePacket(Message message) {
    Conversation conversation = message.getConversation();
    Account account = conversation.getAccount();
    MessagePacket packet = new MessagePacket();
    final boolean isWithSelf = conversation.getContact().isSelf();
    if (conversation.getMode() == Conversation.MODE_SINGLE) {
        packet.setTo(message.getCounterpart());
        packet.setType(MessagePacket.TYPE_CHAT);
        if (this.mXmppConnectionService.indicateReceived() && !isWithSelf) {
            packet.addChild("request", "urn:xmpp:receipts");
        }
    } else if (message.getType() == Message.TYPE_PRIVATE) {
        packet.setTo(message.getCounterpart());
        packet.setType(MessagePacket.TYPE_CHAT);
        packet.addChild("x", "http://jabber.org/protocol/muc#user");
        if (this.mXmppConnectionService.indicateReceived()) {
            packet.addChild("request", "urn:xmpp:receipts");
        }
    } else {
        packet.setTo(message.getCounterpart().toBareJid());
        packet.setType(MessagePacket.TYPE_GROUPCHAT);
    }
    if (conversation.isSingleOrPrivateAndNonAnonymous() && message.getType() != Message.TYPE_PRIVATE) {
        packet.addChild("markable", "urn:xmpp:chat-markers:0");
    }
    packet.setFrom(account.getJid());
    packet.setId(message.getUuid());
    packet.addChild("origin-id", Namespace.STANZA_IDS).setAttribute("id", message.getUuid());
    if (message.edited()) {
        packet.addChild("replace", "urn:xmpp:message-correct:0").setAttribute("id", message.getEditedId());
    }
    return packet;
}
Also used : MessagePacket(de.pixart.messenger.xmpp.stanzas.MessagePacket) Account(de.pixart.messenger.entities.Account) Conversation(de.pixart.messenger.entities.Conversation)

Aggregations

Conversation (de.pixart.messenger.entities.Conversation)69 Jid (de.pixart.messenger.xmpp.jid.Jid)20 Account (de.pixart.messenger.entities.Account)18 InvalidJidException (de.pixart.messenger.xmpp.jid.InvalidJidException)16 Message (de.pixart.messenger.entities.Message)15 Contact (de.pixart.messenger.entities.Contact)11 MucOptions (de.pixart.messenger.entities.MucOptions)9 Intent (android.content.Intent)7 SuppressLint (android.annotation.SuppressLint)6 Uri (android.net.Uri)6 SpannableString (android.text.SpannableString)6 View (android.view.View)6 XmppAxolotlMessage (de.pixart.messenger.crypto.axolotl.XmppAxolotlMessage)6 DownloadableFile (de.pixart.messenger.entities.DownloadableFile)6 Element (de.pixart.messenger.xml.Element)6 MessagePacket (de.pixart.messenger.xmpp.stanzas.MessagePacket)6 IOException (java.io.IOException)6 Fragment (android.app.Fragment)5 SharedPreferences (android.content.SharedPreferences)5 Bitmap (android.graphics.Bitmap)5