Search in sources :

Example 61 with Conversation

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

the class ConversationActivity method openConversation.

private void openConversation() {
    this.updateActionBarTitle();
    this.invalidateOptionsMenu();
    if (xmppConnectionServiceBound) {
        final Conversation conversation = getSelectedConversation();
        xmppConnectionService.getNotificationService().setOpenConversation(conversation);
        sendReadMarkerIfNecessary(conversation);
    }
    listAdapter.notifyDataSetChanged();
}
Also used : Conversation(eu.siacs.conversations.entities.Conversation)

Example 62 with Conversation

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

the class ConversationActivity method onActivityResult.

@Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == REQUEST_DECRYPT_PGP) {
            mConversationFragment.onActivityResult(requestCode, resultCode, data);
        } else if (requestCode == REQUEST_CHOOSE_PGP_ID) {
            // the user chose OpenPGP for encryption and selected his key in the PGP provider
            if (xmppConnectionServiceBound) {
                if (data.getExtras().containsKey(OpenPgpApi.EXTRA_SIGN_KEY_ID)) {
                    // associate selected PGP keyId with the account
                    mSelectedConversation.getAccount().setPgpSignId(data.getExtras().getLong(OpenPgpApi.EXTRA_SIGN_KEY_ID));
                    // we need to announce the key as described in XEP-027
                    announcePgp(mSelectedConversation.getAccount(), null, onOpenPGPKeyPublished);
                } else {
                    choosePgpSignId(mSelectedConversation.getAccount());
                }
                this.mPostponedActivityResult = null;
            } else {
                this.mPostponedActivityResult = new Pair<>(requestCode, data);
            }
        } else if (requestCode == REQUEST_ANNOUNCE_PGP) {
            if (xmppConnectionServiceBound) {
                announcePgp(mSelectedConversation.getAccount(), mSelectedConversation, onOpenPGPKeyPublished);
                this.mPostponedActivityResult = null;
            } else {
                this.mPostponedActivityResult = new Pair<>(requestCode, data);
            }
        } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_IMAGE) {
            mPendingImageUris.clear();
            mPendingImageUris.addAll(extractUriFromIntent(data));
            if (xmppConnectionServiceBound) {
                for (Iterator<Uri> i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) {
                    Log.d(Config.LOGTAG, "ConversationsActivity.onActivityResult() - attaching image to conversations. CHOOSE_IMAGE");
                    attachImageToConversation(getSelectedConversation(), i.next());
                }
            }
        } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE) {
            final List<Uri> uris = extractUriFromIntent(data);
            final Conversation c = getSelectedConversation();
            final OnPresenceSelected callback = new OnPresenceSelected() {

                @Override
                public void onPresenceSelected() {
                    mPendingFileUris.clear();
                    mPendingFileUris.addAll(uris);
                    if (xmppConnectionServiceBound) {
                        for (Iterator<Uri> i = mPendingFileUris.iterator(); i.hasNext(); i.remove()) {
                            Log.d(Config.LOGTAG, "ConversationsActivity.onActivityResult() - attaching file to conversations. CHOOSE_FILE/RECORD_VOICE");
                            attachFileToConversation(c, i.next());
                        }
                    }
                }
            };
            if (c == null || c.getMode() == Conversation.MODE_MULTI || FileBackend.allFilesUnderSize(this, uris, getMaxHttpUploadSize(c)) || c.getNextEncryption() == Message.ENCRYPTION_OTR) {
                callback.onPresenceSelected();
            } else {
                selectPresence(c, callback);
            }
        } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) {
            if (mPendingImageUris.size() == 1) {
                Uri uri = FileBackend.getIndexableTakePhotoUri(mPendingImageUris.get(0));
                mPendingImageUris.set(0, uri);
                if (xmppConnectionServiceBound) {
                    Log.d(Config.LOGTAG, "ConversationsActivity.onActivityResult() - attaching image to conversations. TAKE_PHOTO");
                    attachImageToConversation(getSelectedConversation(), uri);
                    mPendingImageUris.clear();
                }
                if (!Config.ONLY_INTERNAL_STORAGE) {
                    Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                    intent.setData(uri);
                    sendBroadcast(intent);
                }
            } else {
                mPendingImageUris.clear();
            }
        } else if (requestCode == ATTACHMENT_CHOICE_LOCATION) {
            double latitude = data.getDoubleExtra("latitude", 0);
            double longitude = data.getDoubleExtra("longitude", 0);
            this.mPendingGeoUri = Uri.parse("geo:" + String.valueOf(latitude) + "," + String.valueOf(longitude));
            if (xmppConnectionServiceBound) {
                attachLocationToConversation(getSelectedConversation(), mPendingGeoUri);
                this.mPendingGeoUri = null;
            }
        } else if (requestCode == REQUEST_TRUST_KEYS_TEXT || requestCode == REQUEST_TRUST_KEYS_MENU) {
            this.forbidProcessingPendings = !xmppConnectionServiceBound;
            if (xmppConnectionServiceBound) {
                mConversationFragment.onActivityResult(requestCode, resultCode, data);
                this.mPostponedActivityResult = null;
            } else {
                this.mPostponedActivityResult = new Pair<>(requestCode, data);
            }
        }
    } else {
        mPendingImageUris.clear();
        mPendingFileUris.clear();
        if (requestCode == ConversationActivity.REQUEST_DECRYPT_PGP) {
            mConversationFragment.onActivityResult(requestCode, resultCode, data);
        }
        if (requestCode == REQUEST_BATTERY_OP) {
            setNeverAskForBatteryOptimizationsAgain();
        }
    }
}
Also used : Iterator(java.util.Iterator) Conversation(eu.siacs.conversations.entities.Conversation) PendingIntent(android.app.PendingIntent) Intent(android.content.Intent) Uri(android.net.Uri) Pair(android.util.Pair)

Example 63 with Conversation

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

the class ConversationActivity method attachFile.

public void attachFile(final int attachmentChoice) {
    if (attachmentChoice != ATTACHMENT_CHOICE_LOCATION) {
        if (!Config.ONLY_INTERNAL_STORAGE && !hasStoragePermission(attachmentChoice)) {
            return;
        }
    }
    switch(attachmentChoice) {
        case ATTACHMENT_CHOICE_LOCATION:
            getPreferences().edit().putString("recently_used_quick_action", "location").apply();
            break;
        case ATTACHMENT_CHOICE_RECORD_VOICE:
            getPreferences().edit().putString("recently_used_quick_action", "voice").apply();
            break;
        case ATTACHMENT_CHOICE_TAKE_PHOTO:
            getPreferences().edit().putString("recently_used_quick_action", "photo").apply();
            break;
        case ATTACHMENT_CHOICE_CHOOSE_IMAGE:
            getPreferences().edit().putString("recently_used_quick_action", "picture").apply();
            break;
    }
    final Conversation conversation = getSelectedConversation();
    final int encryption = conversation.getNextEncryption();
    final int mode = conversation.getMode();
    if (encryption == Message.ENCRYPTION_PGP) {
        if (hasPgp()) {
            if (mode == Conversation.MODE_SINGLE && conversation.getContact().getPgpKeyId() != 0) {
                xmppConnectionService.getPgpEngine().hasKey(conversation.getContact(), new UiCallback<Contact>() {

                    @Override
                    public void userInputRequried(PendingIntent pi, Contact contact) {
                        ConversationActivity.this.runIntent(pi, attachmentChoice);
                    }

                    @Override
                    public void success(Contact contact) {
                        selectPresenceToAttachFile(attachmentChoice, encryption);
                    }

                    @Override
                    public void error(int error, Contact contact) {
                        replaceToast(getString(error));
                    }
                });
            } else if (mode == Conversation.MODE_MULTI && conversation.getMucOptions().pgpKeysInUse()) {
                if (!conversation.getMucOptions().everybodyHasKeys()) {
                    Toast warning = Toast.makeText(this, R.string.missing_public_keys, Toast.LENGTH_LONG);
                    warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                    warning.show();
                }
                selectPresenceToAttachFile(attachmentChoice, encryption);
            } else {
                final ConversationFragment fragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation");
                if (fragment != null) {
                    fragment.showNoPGPKeyDialog(false, new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            conversation.setNextEncryption(Message.ENCRYPTION_NONE);
                            xmppConnectionService.updateConversation(conversation);
                            selectPresenceToAttachFile(attachmentChoice, Message.ENCRYPTION_NONE);
                        }
                    });
                }
            }
        } else {
            showInstallPgpDialog();
        }
    } else {
        if (encryption != Message.ENCRYPTION_AXOLOTL || !trustKeysIfNeeded(REQUEST_TRUST_KEYS_MENU, attachmentChoice)) {
            selectPresenceToAttachFile(attachmentChoice, encryption);
        }
    }
}
Also used : Toast(android.widget.Toast) DialogInterface(android.content.DialogInterface) OnClickListener(android.content.DialogInterface.OnClickListener) Conversation(eu.siacs.conversations.entities.Conversation) PendingIntent(android.app.PendingIntent) SuppressLint(android.annotation.SuppressLint) Contact(eu.siacs.conversations.entities.Contact)

Example 64 with Conversation

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

the class XmppConnectionService method onOtrSessionEstablished.

public void onOtrSessionEstablished(Conversation conversation) {
    final Account account = conversation.getAccount();
    final Session otrSession = conversation.getOtrSession();
    Log.d(Config.LOGTAG, account.getJid().toBareJid() + " otr session established with " + conversation.getJid() + "/" + otrSession.getSessionID().getUserID());
    conversation.findUnsentMessagesWithEncryption(Message.ENCRYPTION_OTR, new Conversation.OnMessageFound() {

        @Override
        public void onMessageFound(Message message) {
            SessionID id = otrSession.getSessionID();
            try {
                message.setCounterpart(Jid.fromString(id.getAccountID() + "/" + id.getUserID()));
            } catch (InvalidJidException e) {
                return;
            }
            if (message.needsUploading()) {
                mJingleConnectionManager.createNewConnection(message);
            } else {
                MessagePacket outPacket = mMessageGenerator.generateOtrChat(message);
                if (outPacket != null) {
                    mMessageGenerator.addDelay(outPacket, message.getTimeSent());
                    message.setStatus(Message.STATUS_SEND);
                    databaseBackend.updateMessage(message);
                    sendMessagePacket(account, outPacket);
                }
            }
            updateConversationUi();
        }
    });
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Account(eu.siacs.conversations.entities.Account) XmppAxolotlMessage(eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage) Message(eu.siacs.conversations.entities.Message) InvalidJidException(eu.siacs.conversations.xmpp.jid.InvalidJidException) Conversation(eu.siacs.conversations.entities.Conversation) SessionID(net.java.otr4j.session.SessionID) Session(net.java.otr4j.session.Session)

Example 65 with Conversation

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

the class OtrService method injectMessage.

@Override
public void injectMessage(SessionID session, String body) throws OtrException {
    MessagePacket packet = new MessagePacket();
    packet.setFrom(account.getJid());
    if (session.getUserID().isEmpty()) {
        packet.setAttribute("to", session.getAccountID());
    } else {
        packet.setAttribute("to", session.getAccountID() + "/" + session.getUserID());
    }
    packet.setBody(body);
    MessageGenerator.addMessageHints(packet);
    try {
        Jid jid = Jid.fromSessionID(session);
        Conversation conversation = mXmppConnectionService.find(account, jid);
        if (conversation != null && conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) {
            if (mXmppConnectionService.sendChatStates()) {
                packet.addChild(ChatState.toElement(conversation.getOutgoingChatState()));
            }
        }
    } catch (final InvalidJidException ignored) {
    }
    packet.setType(MessagePacket.TYPE_CHAT);
    packet.addChild("encryption", "urn:xmpp:eme:0").setAttribute("namespace", "urn:xmpp:otr:0");
    account.getXmppConnection().sendMessagePacket(packet);
}
Also used : MessagePacket(eu.siacs.conversations.xmpp.stanzas.MessagePacket) Jid(eu.siacs.conversations.xmpp.jid.Jid) InvalidJidException(eu.siacs.conversations.xmpp.jid.InvalidJidException) Conversation(eu.siacs.conversations.entities.Conversation)

Aggregations

Conversation (eu.siacs.conversations.entities.Conversation)110 Account (eu.siacs.conversations.entities.Account)27 Message (eu.siacs.conversations.entities.Message)24 Jid (eu.siacs.conversations.xmpp.Jid)22 Contact (eu.siacs.conversations.entities.Contact)17 MucOptions (eu.siacs.conversations.entities.MucOptions)10 Intent (android.content.Intent)9 Element (eu.siacs.conversations.xml.Element)9 PendingIntent (android.app.PendingIntent)8 XmppAxolotlMessage (eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage)8 MessagePacket (eu.siacs.conversations.xmpp.stanzas.MessagePacket)8 Uri (android.net.Uri)7 Conversational (eu.siacs.conversations.entities.Conversational)7 InvalidJidException (eu.siacs.conversations.xmpp.jid.InvalidJidException)7 SuppressLint (android.annotation.SuppressLint)6 SpannableString (android.text.SpannableString)6 XmppConnection (eu.siacs.conversations.xmpp.XmppConnection)6 Jid (eu.siacs.conversations.xmpp.jid.Jid)6 ArrayList (java.util.ArrayList)6 Fragment (android.app.Fragment)4