Search in sources :

Example 1 with Avatar

use of eu.siacs.conversations.xmpp.pep.Avatar in project Conversations by siacs.

the class FileBackend method getPepAvatar.

public Avatar getPepAvatar(Uri image, int size, Bitmap.CompressFormat format) {
    try {
        Avatar avatar = new Avatar();
        Bitmap bm = cropCenterSquare(image, size);
        if (bm == null) {
            return null;
        }
        ByteArrayOutputStream mByteArrayOutputStream = new ByteArrayOutputStream();
        Base64OutputStream mBase64OutputStream = new Base64OutputStream(mByteArrayOutputStream, Base64.DEFAULT);
        MessageDigest digest = MessageDigest.getInstance("SHA-1");
        DigestOutputStream mDigestOutputStream = new DigestOutputStream(mBase64OutputStream, digest);
        if (!bm.compress(format, 75, mDigestOutputStream)) {
            return null;
        }
        mDigestOutputStream.flush();
        mDigestOutputStream.close();
        avatar.sha1sum = CryptoHelper.bytesToHex(digest.digest());
        avatar.image = new String(mByteArrayOutputStream.toByteArray());
        return avatar;
    } catch (NoSuchAlgorithmException e) {
        return null;
    } catch (IOException e) {
        return null;
    }
}
Also used : Bitmap(android.graphics.Bitmap) DigestOutputStream(java.security.DigestOutputStream) ByteArrayOutputStream(java.io.ByteArrayOutputStream) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) IOException(java.io.IOException) Base64OutputStream(android.util.Base64OutputStream) MessageDigest(java.security.MessageDigest) Avatar(eu.siacs.conversations.xmpp.pep.Avatar)

Example 2 with Avatar

use of eu.siacs.conversations.xmpp.pep.Avatar in project Conversations by siacs.

the class XmppConnectionService method publishAvatar.

public void publishAvatar(Account account, Uri image, UiCallback<Avatar> callback) {
    final Bitmap.CompressFormat format = Config.AVATAR_FORMAT;
    final int size = Config.AVATAR_SIZE;
    final Avatar avatar = getFileBackend().getPepAvatar(image, size, format);
    if (avatar != null) {
        avatar.height = size;
        avatar.width = size;
        if (format.equals(Bitmap.CompressFormat.WEBP)) {
            avatar.type = "image/webp";
        } else if (format.equals(Bitmap.CompressFormat.JPEG)) {
            avatar.type = "image/jpeg";
        } else if (format.equals(Bitmap.CompressFormat.PNG)) {
            avatar.type = "image/png";
        }
        if (!getFileBackend().save(avatar)) {
            callback.error(R.string.error_saving_avatar, avatar);
            return;
        }
        publishAvatar(account, avatar, callback);
    } else {
        callback.error(R.string.error_publish_avatar_converting, null);
    }
}
Also used : Bitmap(android.graphics.Bitmap) SuppressLint(android.annotation.SuppressLint) Avatar(eu.siacs.conversations.xmpp.pep.Avatar)

Example 3 with Avatar

use of eu.siacs.conversations.xmpp.pep.Avatar in project Conversations by siacs.

the class MessageParser method parseEvent.

private void parseEvent(final Element event, final Jid from, final Account account) {
    Element items = event.findChild("items");
    String node = items == null ? null : items.getAttribute("node");
    if ("urn:xmpp:avatar:metadata".equals(node)) {
        Avatar avatar = Avatar.parseMetadata(items);
        if (avatar != null) {
            avatar.owner = from.toBareJid();
            if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) {
                if (account.getJid().toBareJid().equals(from)) {
                    if (account.setAvatar(avatar.getFilename())) {
                        mXmppConnectionService.databaseBackend.updateAccount(account);
                    }
                    mXmppConnectionService.getAvatarService().clear(account);
                    mXmppConnectionService.updateConversationUi();
                    mXmppConnectionService.updateAccountUi();
                } else {
                    Contact contact = account.getRoster().getContact(from);
                    contact.setAvatar(avatar);
                    mXmppConnectionService.getAvatarService().clear(contact);
                    mXmppConnectionService.updateConversationUi();
                    mXmppConnectionService.updateRosterUi();
                }
            } else if (mXmppConnectionService.isDataSaverDisabled()) {
                mXmppConnectionService.fetchAvatar(account, avatar);
            }
        }
    } else if ("http://jabber.org/protocol/nick".equals(node)) {
        Element i = items.findChild("item");
        Element nick = i == null ? null : i.findChild("nick", "http://jabber.org/protocol/nick");
        if (nick != null && nick.getContent() != null) {
            Contact contact = account.getRoster().getContact(from);
            contact.setPresenceName(nick.getContent());
            mXmppConnectionService.getAvatarService().clear(account);
            mXmppConnectionService.updateConversationUi();
            mXmppConnectionService.updateAccountUi();
        }
    } else if (AxolotlService.PEP_DEVICE_LIST.equals(node)) {
        Element item = items.findChild("item");
        Set<Integer> deviceIds = mXmppConnectionService.getIqParser().deviceIds(item);
        Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received PEP device list (" + deviceIds + ") update from " + from + ", processing...");
        AxolotlService axolotlService = account.getAxolotlService();
        axolotlService.registerDevices(from, deviceIds);
        mXmppConnectionService.updateAccountUi();
    }
}
Also used : AxolotlService(eu.siacs.conversations.crypto.axolotl.AxolotlService) Element(eu.siacs.conversations.xml.Element) Avatar(eu.siacs.conversations.xmpp.pep.Avatar) Contact(eu.siacs.conversations.entities.Contact)

Example 4 with Avatar

use of eu.siacs.conversations.xmpp.pep.Avatar in project Conversations by siacs.

the class PresenceParser method processConferencePresence.

private void processConferencePresence(PresencePacket packet, Conversation conversation) {
    MucOptions mucOptions = conversation.getMucOptions();
    final Jid from = packet.getFrom();
    if (!from.isBareJid()) {
        final String type = packet.getAttribute("type");
        final Element x = packet.findChild("x", "http://jabber.org/protocol/muc#user");
        Avatar avatar = Avatar.parsePresence(packet.findChild("x", "vcard-temp:x:update"));
        final List<String> codes = getStatusCodes(x);
        if (type == null) {
            if (x != null) {
                Element item = x.findChild("item");
                if (item != null && !from.isBareJid()) {
                    mucOptions.setError(MucOptions.Error.NONE);
                    MucOptions.User user = parseItem(conversation, item, from);
                    if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE)) {
                        mucOptions.setOnline();
                        mucOptions.setSelf(user);
                        if (mucOptions.onRenameListener != null) {
                            mucOptions.onRenameListener.onSuccess();
                            mucOptions.onRenameListener = null;
                        }
                    }
                    mucOptions.updateUser(user);
                    if (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED) && mucOptions.autoPushConfiguration()) {
                        Log.d(Config.LOGTAG, mucOptions.getAccount().getJid().toBareJid() + ": room '" + mucOptions.getConversation().getJid().toBareJid() + "' created. pushing default configuration");
                        mXmppConnectionService.pushConferenceConfiguration(mucOptions.getConversation(), IqGenerator.defaultRoomConfiguration(), null);
                    }
                    if (mXmppConnectionService.getPgpEngine() != null) {
                        Element signed = packet.findChild("x", "jabber:x:signed");
                        if (signed != null) {
                            Element status = packet.findChild("status");
                            String msg = status == null ? "" : status.getContent();
                            long keyId = mXmppConnectionService.getPgpEngine().fetchKeyId(mucOptions.getAccount(), msg, signed.getContent());
                            if (keyId != 0) {
                                user.setPgpKeyId(keyId);
                            }
                        }
                    }
                    if (avatar != null) {
                        avatar.owner = from;
                        if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) {
                            if (user.setAvatar(avatar)) {
                                mXmppConnectionService.getAvatarService().clear(user);
                            }
                        } else if (mXmppConnectionService.isDataSaverDisabled()) {
                            mXmppConnectionService.fetchAvatar(mucOptions.getAccount(), avatar);
                        }
                    }
                }
            }
        } else if (type.equals("unavailable")) {
            if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || packet.getFrom().equals(mucOptions.getConversation().getJid())) {
                if (codes.contains(MucOptions.STATUS_CODE_KICKED)) {
                    mucOptions.setError(MucOptions.Error.KICKED);
                } else if (codes.contains(MucOptions.STATUS_CODE_BANNED)) {
                    mucOptions.setError(MucOptions.Error.BANNED);
                } else if (codes.contains(MucOptions.STATUS_CODE_LOST_MEMBERSHIP)) {
                    mucOptions.setError(MucOptions.Error.MEMBERS_ONLY);
                } else if (codes.contains(MucOptions.STATUS_CODE_AFFILIATION_CHANGE)) {
                    mucOptions.setError(MucOptions.Error.MEMBERS_ONLY);
                } else if (codes.contains(MucOptions.STATUS_CODE_SHUTDOWN)) {
                    mucOptions.setError(MucOptions.Error.SHUTDOWN);
                } else if (!codes.contains(MucOptions.STATUS_CODE_CHANGED_NICK)) {
                    mucOptions.setError(MucOptions.Error.UNKNOWN);
                    Log.d(Config.LOGTAG, "unknown error in conference: " + packet);
                }
            } else if (!from.isBareJid()) {
                Element item = x.findChild("item");
                if (item != null) {
                    mucOptions.updateUser(parseItem(conversation, item, from));
                }
                MucOptions.User user = mucOptions.deleteUser(from);
                if (user != null) {
                    mXmppConnectionService.getAvatarService().clear(user);
                }
            }
        } else if (type.equals("error")) {
            Element error = packet.findChild("error");
            if (error != null && error.hasChild("conflict")) {
                if (mucOptions.online()) {
                    if (mucOptions.onRenameListener != null) {
                        mucOptions.onRenameListener.onFailure();
                        mucOptions.onRenameListener = null;
                    }
                } else {
                    mucOptions.setError(MucOptions.Error.NICK_IN_USE);
                }
            } else if (error != null && error.hasChild("not-authorized")) {
                mucOptions.setError(MucOptions.Error.PASSWORD_REQUIRED);
            } else if (error != null && error.hasChild("forbidden")) {
                mucOptions.setError(MucOptions.Error.BANNED);
            } else if (error != null && error.hasChild("registration-required")) {
                mucOptions.setError(MucOptions.Error.MEMBERS_ONLY);
            }
        }
    }
}
Also used : MucOptions(eu.siacs.conversations.entities.MucOptions) Jid(eu.siacs.conversations.xmpp.jid.Jid) Element(eu.siacs.conversations.xml.Element) Avatar(eu.siacs.conversations.xmpp.pep.Avatar)

Example 5 with Avatar

use of eu.siacs.conversations.xmpp.pep.Avatar in project Conversations by siacs.

the class PresenceParser method parseContactPresence.

public void parseContactPresence(final PresencePacket packet, final Account account) {
    final PresenceGenerator mPresenceGenerator = mXmppConnectionService.getPresenceGenerator();
    final Jid from = packet.getFrom();
    if (from == null || from.equals(account.getJid())) {
        return;
    }
    final String type = packet.getAttribute("type");
    final Contact contact = account.getRoster().getContact(from);
    if (type == null) {
        final String resource = from.isBareJid() ? "" : from.getResourcepart();
        contact.setPresenceName(packet.findChildContent("nick", "http://jabber.org/protocol/nick"));
        Avatar avatar = Avatar.parsePresence(packet.findChild("x", "vcard-temp:x:update"));
        if (avatar != null && (!contact.isSelf() || account.getAvatar() == null)) {
            avatar.owner = from.toBareJid();
            if (mXmppConnectionService.getFileBackend().isAvatarCached(avatar)) {
                if (avatar.owner.equals(account.getJid().toBareJid())) {
                    account.setAvatar(avatar.getFilename());
                    mXmppConnectionService.databaseBackend.updateAccount(account);
                    mXmppConnectionService.getAvatarService().clear(account);
                    mXmppConnectionService.updateConversationUi();
                    mXmppConnectionService.updateAccountUi();
                } else if (contact.setAvatar(avatar)) {
                    mXmppConnectionService.getAvatarService().clear(contact);
                    mXmppConnectionService.updateConversationUi();
                    mXmppConnectionService.updateRosterUi();
                }
            } else if (mXmppConnectionService.isDataSaverDisabled()) {
                mXmppConnectionService.fetchAvatar(account, avatar);
            }
        }
        int sizeBefore = contact.getPresences().size();
        final String show = packet.findChildContent("show");
        final Element caps = packet.findChild("c", "http://jabber.org/protocol/caps");
        final String message = packet.findChildContent("status");
        final Presence presence = Presence.parse(show, caps, message);
        contact.updatePresence(resource, presence);
        if (presence.hasCaps()) {
            mXmppConnectionService.fetchCaps(account, from, presence);
        }
        final Element idle = packet.findChild("idle", "urn:xmpp:idle:1");
        if (idle != null) {
            contact.flagInactive();
            String since = idle.getAttribute("since");
            try {
                contact.setLastseen(AbstractParser.parseTimestamp(since));
            } catch (NullPointerException | ParseException e) {
                contact.setLastseen(System.currentTimeMillis());
            }
        } else {
            contact.flagActive();
            contact.setLastseen(AbstractParser.parseTimestamp(packet));
        }
        PgpEngine pgp = mXmppConnectionService.getPgpEngine();
        Element x = packet.findChild("x", "jabber:x:signed");
        if (pgp != null && x != null) {
            Element status = packet.findChild("status");
            String msg = status != null ? status.getContent() : "";
            contact.setPgpKeyId(pgp.fetchKeyId(account, msg, x.getContent()));
        }
        boolean online = sizeBefore < contact.getPresences().size();
        mXmppConnectionService.onContactStatusChanged.onContactStatusChanged(contact, online);
    } else if (type.equals("unavailable")) {
        if (from.isBareJid()) {
            contact.clearPresences();
        } else {
            contact.removePresence(from.getResourcepart());
        }
        mXmppConnectionService.onContactStatusChanged.onContactStatusChanged(contact, false);
    } else if (type.equals("subscribe")) {
        if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
            mXmppConnectionService.sendPresencePacket(account, mPresenceGenerator.sendPresenceUpdatesTo(contact));
        } else {
            contact.setOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST);
            final Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, contact.getJid().toBareJid(), false);
            final String statusMessage = packet.findChildContent("status");
            if (statusMessage != null && !statusMessage.isEmpty() && conversation.countMessages() == 0) {
                conversation.add(new Message(conversation, statusMessage, Message.ENCRYPTION_NONE, Message.STATUS_RECEIVED));
            }
        }
    }
    mXmppConnectionService.updateRosterUi();
}
Also used : PresenceGenerator(eu.siacs.conversations.generator.PresenceGenerator) Jid(eu.siacs.conversations.xmpp.jid.Jid) Message(eu.siacs.conversations.entities.Message) Element(eu.siacs.conversations.xml.Element) PgpEngine(eu.siacs.conversations.crypto.PgpEngine) Conversation(eu.siacs.conversations.entities.Conversation) Avatar(eu.siacs.conversations.xmpp.pep.Avatar) Contact(eu.siacs.conversations.entities.Contact) Presence(eu.siacs.conversations.entities.Presence) ParseException(java.text.ParseException)

Aggregations

Avatar (eu.siacs.conversations.xmpp.pep.Avatar)8 Element (eu.siacs.conversations.xml.Element)5 Bitmap (android.graphics.Bitmap)2 Base64OutputStream (android.util.Base64OutputStream)2 Account (eu.siacs.conversations.entities.Account)2 Contact (eu.siacs.conversations.entities.Contact)2 OnIqPacketReceived (eu.siacs.conversations.xmpp.OnIqPacketReceived)2 Jid (eu.siacs.conversations.xmpp.jid.Jid)2 IqPacket (eu.siacs.conversations.xmpp.stanzas.IqPacket)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)2 IOException (java.io.IOException)2 DigestOutputStream (java.security.DigestOutputStream)2 MessageDigest (java.security.MessageDigest)2 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)2 SuppressLint (android.annotation.SuppressLint)1 BitmapFactory (android.graphics.BitmapFactory)1 Paint (android.graphics.Paint)1 PgpEngine (eu.siacs.conversations.crypto.PgpEngine)1 AxolotlService (eu.siacs.conversations.crypto.axolotl.AxolotlService)1 Conversation (eu.siacs.conversations.entities.Conversation)1