Search in sources :

Example 21 with Contact

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

the class ConferenceDetailsActivity method updateView.

private void updateView() {
    invalidateOptionsMenu();
    final MucOptions mucOptions = mConversation.getMucOptions();
    final User self = mucOptions.getSelf();
    String account;
    if (Config.DOMAIN_LOCK != null) {
        account = mConversation.getAccount().getJid().getLocalpart();
    } else {
        account = mConversation.getAccount().getJid().toBareJid().toString();
    }
    mAccountJid.setText(getString(R.string.using_account, account));
    mYourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48)));
    setTitle(mConversation.getName());
    mFullJid.setText(mConversation.getJid().toBareJid().toString());
    mYourNick.setText(mucOptions.getActualNick());
    mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
    if (mucOptions.online()) {
        mMoreDetails.setVisibility(View.VISIBLE);
        final String status = getStatus(self);
        if (status != null) {
            mRoleAffiliaton.setVisibility(View.VISIBLE);
            mRoleAffiliaton.setText(status);
        } else {
            mRoleAffiliaton.setVisibility(View.GONE);
        }
        if (mucOptions.membersOnly()) {
            mConferenceType.setText(R.string.private_conference);
        } else {
            mConferenceType.setText(R.string.public_conference);
        }
        if (mucOptions.mamSupport()) {
            mConferenceInfoMam.setText(R.string.server_info_available);
        } else {
            mConferenceInfoMam.setText(R.string.server_info_unavailable);
        }
        if (self.getAffiliation().ranks(MucOptions.Affiliation.OWNER)) {
            mChangeConferenceSettingsButton.setVisibility(View.VISIBLE);
        } else {
            mChangeConferenceSettingsButton.setVisibility(View.GONE);
        }
    }
    int ic_notifications = getThemeResource(R.attr.icon_notifications, R.drawable.ic_notifications_black54_24dp);
    int ic_notifications_off = getThemeResource(R.attr.icon_notifications_off, R.drawable.ic_notifications_off_black54_24dp);
    int ic_notifications_paused = getThemeResource(R.attr.icon_notifications_paused, R.drawable.ic_notifications_paused_black54_24dp);
    int ic_notifications_none = getThemeResource(R.attr.icon_notifications_none, R.drawable.ic_notifications_none_black54_24dp);
    long mutedTill = mConversation.getLongAttribute(Conversation.ATTRIBUTE_MUTED_TILL, 0);
    if (mutedTill == Long.MAX_VALUE) {
        mNotifyStatusText.setText(R.string.notify_never);
        mNotifyStatusButton.setImageResource(ic_notifications_off);
    } else if (System.currentTimeMillis() < mutedTill) {
        mNotifyStatusText.setText(R.string.notify_paused);
        mNotifyStatusButton.setImageResource(ic_notifications_paused);
    } else if (mConversation.alwaysNotify()) {
        mNotifyStatusButton.setImageResource(ic_notifications);
        mNotifyStatusText.setText(R.string.notify_on_all_messages);
    } else {
        mNotifyStatusButton.setImageResource(ic_notifications_none);
        mNotifyStatusText.setText(R.string.notify_only_when_highlighted);
    }
    LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    membersView.removeAllViews();
    final ArrayList<User> users = mucOptions.getUsers();
    Collections.sort(users);
    for (final User user : users) {
        View view = inflater.inflate(R.layout.contact, membersView, false);
        this.setListItemBackgroundOnView(view);
        view.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View view) {
                highlightInMuc(mConversation, user.getName());
            }
        });
        registerForContextMenu(view);
        view.setTag(user);
        TextView tvDisplayName = (TextView) view.findViewById(R.id.contact_display_name);
        TextView tvKey = (TextView) view.findViewById(R.id.key);
        TextView tvStatus = (TextView) view.findViewById(R.id.contact_jid);
        if (mAdvancedMode && user.getPgpKeyId() != 0) {
            tvKey.setVisibility(View.VISIBLE);
            tvKey.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    viewPgpKey(user);
                }
            });
            tvKey.setText(OpenPgpUtils.convertKeyIdToHex(user.getPgpKeyId()));
        }
        Contact contact = user.getContact();
        String name = user.getName();
        if (contact != null) {
            tvDisplayName.setText(contact.getDisplayName());
            tvStatus.setText((name != null ? name + " • " : "") + getStatus(user));
        } else {
            tvDisplayName.setText(name == null ? "" : name);
            tvStatus.setText(getStatus(user));
        }
        ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
        iv.setImageBitmap(avatarService().get(user, getPixel(48), false));
        if (user.getRole() == MucOptions.Role.NONE) {
            tvDisplayName.setAlpha(INACTIVE_ALPHA);
            tvKey.setAlpha(INACTIVE_ALPHA);
            tvStatus.setAlpha(INACTIVE_ALPHA);
            iv.setAlpha(INACTIVE_ALPHA);
        }
        membersView.addView(view);
        if (mConversation.getMucOptions().canInvite()) {
            mInviteButton.setVisibility(View.VISIBLE);
        } else {
            mInviteButton.setVisibility(View.GONE);
        }
    }
}
Also used : User(eu.siacs.conversations.entities.MucOptions.User) ImageView(android.widget.ImageView) View(android.view.View) TextView(android.widget.TextView) Contact(eu.siacs.conversations.entities.Contact) MucOptions(eu.siacs.conversations.entities.MucOptions) LayoutInflater(android.view.LayoutInflater) OnClickListener(android.view.View.OnClickListener) TextView(android.widget.TextView) ImageView(android.widget.ImageView)

Example 22 with Contact

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

the class XmppConnectionService method findOrCreateConversation.

public Conversation findOrCreateConversation(final Account account, final Jid jid, final boolean muc, final boolean joinAfterCreate, final MessageArchiveService.Query query) {
    synchronized (this.conversations) {
        Conversation conversation = find(account, jid);
        if (conversation != null) {
            return conversation;
        }
        conversation = databaseBackend.findConversation(account, jid);
        final boolean loadMessagesFromDb;
        if (conversation != null) {
            conversation.setStatus(Conversation.STATUS_AVAILABLE);
            conversation.setAccount(account);
            if (muc) {
                conversation.setMode(Conversation.MODE_MULTI);
                conversation.setContactJid(jid);
            } else {
                conversation.setMode(Conversation.MODE_SINGLE);
                conversation.setContactJid(jid.toBareJid());
            }
            databaseBackend.updateConversation(conversation);
            loadMessagesFromDb = conversation.messagesLoaded.compareAndSet(true, false);
        } else {
            String conversationName;
            Contact contact = account.getRoster().getContact(jid);
            if (contact != null) {
                conversationName = contact.getDisplayName();
            } else {
                conversationName = jid.getLocalpart();
            }
            if (muc) {
                conversation = new Conversation(conversationName, account, jid, Conversation.MODE_MULTI);
            } else {
                conversation = new Conversation(conversationName, account, jid.toBareJid(), Conversation.MODE_SINGLE);
            }
            this.databaseBackend.createConversation(conversation);
            loadMessagesFromDb = false;
        }
        final Conversation c = conversation;
        mDatabaseExecutor.execute(new Runnable() {

            @Override
            public void run() {
                if (loadMessagesFromDb) {
                    c.addAll(0, databaseBackend.getMessages(c, Config.PAGE_SIZE));
                    updateConversationUi();
                    c.messagesLoaded.set(true);
                }
                if (account.getXmppConnection() != null && account.getXmppConnection().getFeatures().mam() && !muc) {
                    if (query == null) {
                        mMessageArchiveService.query(c);
                    } else {
                        if (query.getConversation() == null) {
                            mMessageArchiveService.query(c, query.getStart());
                        }
                    }
                }
                checkDeletedFiles(c);
                if (joinAfterCreate) {
                    joinMuc(c);
                }
            }
        });
        this.conversations.add(conversation);
        updateConversationUi();
        return conversation;
    }
}
Also used : Conversation(eu.siacs.conversations.entities.Conversation) Contact(eu.siacs.conversations.entities.Contact)

Example 23 with Contact

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

the class ConversationFragment method sendPgpMessage.

protected void sendPgpMessage(final Message message) {
    final ConversationActivity activity = (ConversationActivity) getActivity();
    final XmppConnectionService xmppService = activity.xmppConnectionService;
    final Contact contact = message.getConversation().getContact();
    if (!activity.hasPgp()) {
        activity.showInstallPgpDialog();
        return;
    }
    if (conversation.getAccount().getPgpSignature() == null) {
        activity.announcePgp(conversation.getAccount(), conversation, activity.onOpenPGPKeyPublished);
        return;
    }
    if (!mSendingPgpMessage.compareAndSet(false, true)) {
        Log.d(Config.LOGTAG, "sending pgp message already in progress");
    }
    if (conversation.getMode() == Conversation.MODE_SINGLE) {
        if (contact.getPgpKeyId() != 0) {
            xmppService.getPgpEngine().hasKey(contact, new UiCallback<Contact>() {

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

                @Override
                public void success(Contact contact) {
                    activity.encryptTextMessage(message);
                }

                @Override
                public void error(int error, Contact contact) {
                    activity.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            Toast.makeText(activity, R.string.unable_to_connect_to_keychain, Toast.LENGTH_SHORT).show();
                        }
                    });
                    mSendingPgpMessage.set(false);
                }
            });
        } else {
            showNoPGPKeyDialog(false, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    conversation.setNextEncryption(Message.ENCRYPTION_NONE);
                    xmppService.updateConversation(conversation);
                    message.setEncryption(Message.ENCRYPTION_NONE);
                    xmppService.sendMessage(message);
                    messageSent();
                }
            });
        }
    } else {
        if (conversation.getMucOptions().pgpKeysInUse()) {
            if (!conversation.getMucOptions().everybodyHasKeys()) {
                Toast warning = Toast.makeText(getActivity(), R.string.missing_public_keys, Toast.LENGTH_LONG);
                warning.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                warning.show();
            }
            activity.encryptTextMessage(message);
        } else {
            showNoPGPKeyDialog(true, new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    conversation.setNextEncryption(Message.ENCRYPTION_NONE);
                    message.setEncryption(Message.ENCRYPTION_NONE);
                    xmppService.updateConversation(conversation);
                    xmppService.sendMessage(message);
                    messageSent();
                }
            });
        }
    }
}
Also used : XmppConnectionService(eu.siacs.conversations.services.XmppConnectionService) Toast(android.widget.Toast) DialogInterface(android.content.DialogInterface) PendingIntent(android.app.PendingIntent) Contact(eu.siacs.conversations.entities.Contact)

Example 24 with Contact

use of eu.siacs.conversations.entities.Contact 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 25 with Contact

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

the class BlocklistActivity method filterContacts.

@Override
protected void filterContacts(final String needle) {
    getListItems().clear();
    if (account != null) {
        for (final Jid jid : account.getBlocklist()) {
            final Contact contact = account.getRoster().getContact(jid);
            if (contact.match(this, needle) && contact.isBlocked()) {
                getListItems().add(contact);
            }
        }
        Collections.sort(getListItems());
    }
    getListItemAdapter().notifyDataSetChanged();
}
Also used : Jid(eu.siacs.conversations.xmpp.jid.Jid) Contact(eu.siacs.conversations.entities.Contact)

Aggregations

Contact (eu.siacs.conversations.entities.Contact)32 Account (eu.siacs.conversations.entities.Account)9 Jid (eu.siacs.conversations.xmpp.jid.Jid)9 Conversation (eu.siacs.conversations.entities.Conversation)8 Element (eu.siacs.conversations.xml.Element)7 SuppressLint (android.annotation.SuppressLint)5 DialogInterface (android.content.DialogInterface)5 OnClickListener (android.content.DialogInterface.OnClickListener)4 AlertDialog (android.app.AlertDialog)3 Message (eu.siacs.conversations.entities.Message)3 InvalidJidException (eu.siacs.conversations.xmpp.jid.InvalidJidException)3 Builder (android.app.AlertDialog.Builder)2 PendingIntent (android.app.PendingIntent)2 Intent (android.content.Intent)2 Point (android.graphics.Point)2 Uri (android.net.Uri)2 MenuItem (android.view.MenuItem)2 View (android.view.View)2 Toast (android.widget.Toast)2 AxolotlService (eu.siacs.conversations.crypto.axolotl.AxolotlService)2