Search in sources :

Example 11 with Message

use of eu.siacs.conversations.entities.Message in project Conversations by siacs.

the class MessageParser method parseOtrChat.

private Message parseOtrChat(String body, Jid from, String id, Conversation conversation) {
    String presence;
    if (from.isBareJid()) {
        presence = "";
    } else {
        presence = from.getResourcepart();
    }
    if (body.matches("^\\?OTRv\\d{1,2}\\?.*")) {
        conversation.endOtrIfNeeded();
    }
    if (!conversation.hasValidOtrSession()) {
        conversation.startOtrSession(presence, false);
    } else {
        String foreignPresence = conversation.getOtrSession().getSessionID().getUserID();
        if (!foreignPresence.equals(presence)) {
            conversation.endOtrIfNeeded();
            conversation.startOtrSession(presence, false);
        }
    }
    try {
        conversation.setLastReceivedOtrMessageId(id);
        Session otrSession = conversation.getOtrSession();
        body = otrSession.transformReceiving(body);
        SessionStatus status = otrSession.getSessionStatus();
        if (body == null && status == SessionStatus.ENCRYPTED) {
            mXmppConnectionService.onOtrSessionEstablished(conversation);
            return null;
        } else if (body == null && status == SessionStatus.FINISHED) {
            conversation.resetOtrSession();
            mXmppConnectionService.updateConversationUi();
            return null;
        } else if (body == null || (body.isEmpty())) {
            return null;
        }
        if (body.startsWith(CryptoHelper.FILETRANSFER)) {
            String key = body.substring(CryptoHelper.FILETRANSFER.length());
            conversation.setSymmetricKey(CryptoHelper.hexToBytes(key));
            return null;
        }
        if (clientMightSendHtml(conversation.getAccount(), from)) {
            Log.d(Config.LOGTAG, conversation.getAccount().getJid().toBareJid() + ": received OTR message from bad behaving client. escaping HTML…");
            body = Html.fromHtml(body).toString();
        }
        final OtrService otrService = conversation.getAccount().getOtrService();
        Message finishedMessage = new Message(conversation, body, Message.ENCRYPTION_OTR, Message.STATUS_RECEIVED);
        finishedMessage.setFingerprint(otrService.getFingerprint(otrSession.getRemotePublicKey()));
        conversation.setLastReceivedOtrMessageId(null);
        return finishedMessage;
    } catch (Exception e) {
        conversation.resetOtrSession();
        return null;
    }
}
Also used : XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage) Message(eu.siacs.conversations.entities.Message) OtrService(eu.siacs.conversations.crypto.OtrService) SessionStatus(net.java.otr4j.session.SessionStatus) Session(net.java.otr4j.session.Session)

Example 12 with Message

use of eu.siacs.conversations.entities.Message in project Conversations by siacs.

the class MessageGenerator method generateChat.

public MessagePacket generateChat(Message message) {
    MessagePacket packet = preparePacket(message);
    String content;
    if (message.hasFileOnRemoteHost()) {
        Message.FileParams fileParams = message.getFileParams();
        content = fileParams.url.toString();
        packet.addChild("x", "jabber:x:oob").addChild("url").setContent(content);
    } else {
        content = message.getBody();
    }
    packet.setBody(content);
    return packet;
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Message(eu.siacs.conversations.entities.Message) XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage)

Example 13 with Message

use of eu.siacs.conversations.entities.Message in project Conversations by siacs.

the class DatabaseBackend method getMessagesIterable.

public Iterable<Message> getMessagesIterable(final Conversation conversation) {
    return new Iterable<Message>() {

        @Override
        public Iterator<Message> iterator() {
            class MessageIterator implements Iterator<Message> {

                SQLiteDatabase db = getReadableDatabase();

                String[] selectionArgs = { conversation.getUuid() };

                Cursor cursor = db.query(Message.TABLENAME, null, Message.CONVERSATION + "=?", selectionArgs, null, null, Message.TIME_SENT + " ASC", null);

                public MessageIterator() {
                    cursor.moveToFirst();
                }

                @Override
                public boolean hasNext() {
                    return !cursor.isAfterLast();
                }

                @Override
                public Message next() {
                    Message message = Message.fromCursor(cursor);
                    cursor.moveToNext();
                    return message;
                }

                @Override
                public void remove() {
                    throw new UnsupportedOperationException();
                }
            }
            return new MessageIterator();
        }
    };
}
Also used : Message(eu.siacs.conversations.entities.Message) SQLiteDatabase(android.database.sqlite.SQLiteDatabase) Iterator(java.util.Iterator) Cursor(android.database.Cursor)

Example 14 with Message

use of eu.siacs.conversations.entities.Message in project Conversations by siacs.

the class MessageAdapter method displayTextMessage.

private void displayTextMessage(final ViewHolder viewHolder, final Message message, boolean darkBackground, int type) {
    if (viewHolder.download_button != null) {
        viewHolder.download_button.setVisibility(View.GONE);
    }
    viewHolder.image.setVisibility(View.GONE);
    viewHolder.messageBody.setVisibility(View.VISIBLE);
    viewHolder.messageBody.setIncludeFontPadding(true);
    if (message.getBody() != null) {
        final String nick = UIHelper.getMessageDisplayName(message);
        SpannableStringBuilder body = message.getMergedBody();
        boolean hasMeCommand = message.hasMeCommand();
        if (hasMeCommand) {
            body = body.replace(0, Message.ME_COMMAND.length(), nick + " ");
        }
        if (body.length() > Config.MAX_DISPLAY_MESSAGE_CHARS) {
            body = new SpannableStringBuilder(body, 0, Config.MAX_DISPLAY_MESSAGE_CHARS);
            body.append("…");
        }
        Message.MergeSeparator[] mergeSeparators = body.getSpans(0, body.length(), Message.MergeSeparator.class);
        for (Message.MergeSeparator mergeSeparator : mergeSeparators) {
            int start = body.getSpanStart(mergeSeparator);
            int end = body.getSpanEnd(mergeSeparator);
            body.setSpan(new DividerSpan(true), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        boolean startsWithQuote = handleTextQuotes(body, darkBackground);
        if (message.getType() != Message.TYPE_PRIVATE) {
            if (hasMeCommand) {
                body.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 0, nick.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        } else {
            String privateMarker;
            if (message.getStatus() <= Message.STATUS_RECEIVED) {
                privateMarker = activity.getString(R.string.private_message);
            } else {
                final String to;
                if (message.getCounterpart() != null) {
                    to = message.getCounterpart().getResourcepart();
                } else {
                    to = "";
                }
                privateMarker = activity.getString(R.string.private_message_to, to);
            }
            body.insert(0, privateMarker);
            int privateMarkerIndex = privateMarker.length();
            if (startsWithQuote) {
                body.insert(privateMarkerIndex, "\n\n");
                body.setSpan(new DividerSpan(false), privateMarkerIndex, privateMarkerIndex + 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            } else {
                body.insert(privateMarkerIndex, " ");
            }
            body.setSpan(new ForegroundColorSpan(getMessageTextColor(darkBackground, false)), 0, privateMarkerIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            body.setSpan(new StyleSpan(Typeface.BOLD), 0, privateMarkerIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            if (hasMeCommand) {
                body.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), privateMarkerIndex + 1, privateMarkerIndex + 1 + nick.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        if (message.getConversation().getMode() == Conversation.MODE_MULTI && message.getStatus() == Message.STATUS_RECEIVED) {
            Pattern pattern = NotificationService.generateNickHighlightPattern(message.getConversation().getMucOptions().getActualNick());
            Matcher matcher = pattern.matcher(body);
            while (matcher.find()) {
                body.setSpan(new StyleSpan(Typeface.BOLD), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            }
        }
        Linkify.addLinks(body, XMPP_PATTERN, "xmpp");
        Linkify.addLinks(body, Patterns.AUTOLINK_WEB_URL, "http", WEBURL_MATCH_FILTER, WEBURL_TRANSFORM_FILTER);
        Linkify.addLinks(body, GeoHelper.GEO_URI, "geo");
        viewHolder.messageBody.setAutoLinkMask(0);
        viewHolder.messageBody.setText(body);
        viewHolder.messageBody.setTextIsSelectable(true);
        viewHolder.messageBody.setMovementMethod(ClickableMovementMethod.getInstance());
        listSelectionManager.onUpdate(viewHolder.messageBody, message);
    } else {
        viewHolder.messageBody.setText("");
        viewHolder.messageBody.setTextIsSelectable(false);
    }
    viewHolder.messageBody.setTextColor(this.getMessageTextColor(darkBackground, true));
    viewHolder.messageBody.setLinkTextColor(this.getMessageTextColor(darkBackground, true));
    viewHolder.messageBody.setHighlightColor(activity.getResources().getColor(darkBackground ? (type == SENT || !mUseGreenBackground ? R.color.black26 : R.color.grey800) : R.color.grey500));
    viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
}
Also used : Pattern(java.util.regex.Pattern) Message(eu.siacs.conversations.entities.Message) ForegroundColorSpan(android.text.style.ForegroundColorSpan) Matcher(java.util.regex.Matcher) SpannableString(android.text.SpannableString) StyleSpan(android.text.style.StyleSpan) DividerSpan(eu.siacs.conversations.ui.text.DividerSpan) SpannableStringBuilder(android.text.SpannableStringBuilder)

Example 15 with Message

use of eu.siacs.conversations.entities.Message in project Conversations by siacs.

the class ConversationActivity method attachImageToConversation.

private void attachImageToConversation(Conversation conversation, Uri uri) {
    if (conversation == null) {
        return;
    }
    final Toast prepareFileToast = Toast.makeText(getApplicationContext(), getText(R.string.preparing_image), Toast.LENGTH_LONG);
    prepareFileToast.show();
    xmppConnectionService.attachImageToConversation(conversation, uri, new UiCallback<Message>() {

        @Override
        public void userInputRequried(PendingIntent pi, Message object) {
            hidePrepareFileToast(prepareFileToast);
        }

        @Override
        public void success(Message message) {
            hidePrepareFileToast(prepareFileToast);
            xmppConnectionService.sendMessage(message);
        }

        @Override
        public void error(final int error, Message message) {
            hidePrepareFileToast(prepareFileToast);
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    replaceToast(getString(error));
                }
            });
        }
    });
}
Also used : Toast(android.widget.Toast) Message(eu.siacs.conversations.entities.Message) PendingIntent(android.app.PendingIntent) SuppressLint(android.annotation.SuppressLint)

Aggregations

Message (eu.siacs.conversations.entities.Message)39 XmppAxolotlMessage (eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage)16 Conversation (eu.siacs.conversations.entities.Conversation)12 Account (eu.siacs.conversations.entities.Account)9 Jid (eu.siacs.conversations.xmpp.jid.Jid)7 PendingIntent (android.app.PendingIntent)5 InvalidJidException (eu.siacs.conversations.xmpp.jid.InvalidJidException)5 MessagePacket (eu.siacs.conversations.xmpp.stanzas.MessagePacket)5 ArrayList (java.util.ArrayList)5 SuppressLint (android.annotation.SuppressLint)4 SpannableString (android.text.SpannableString)4 NotificationCompat (android.support.v4.app.NotificationCompat)3 StyleSpan (android.text.style.StyleSpan)3 View (android.view.View)3 TextView (android.widget.TextView)3 PgpEngine (eu.siacs.conversations.crypto.PgpEngine)3 Contact (eu.siacs.conversations.entities.Contact)3 Element (eu.siacs.conversations.xml.Element)3 Cursor (android.database.Cursor)2 SQLiteDatabase (android.database.sqlite.SQLiteDatabase)2