diff options
Diffstat (limited to 'src/main')
8 files changed, 131 insertions, 23 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/RawBlockable.java b/src/main/java/de/pixart/messenger/entities/RawBlockable.java new file mode 100644 index 000000000..0c8befc06 --- /dev/null +++ b/src/main/java/de/pixart/messenger/entities/RawBlockable.java @@ -0,0 +1,92 @@ +package de.pixart.messenger.entities; + +import android.content.Context; +import android.text.TextUtils; + +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +import de.pixart.messenger.utils.UIHelper; +import rocks.xmpp.addr.Jid; + +public class RawBlockable implements ListItem, Blockable { + + private final Account account; + private final Jid jid; + + public RawBlockable(Account account, Jid jid) { + this.account = account; + this.jid = jid; + } + + @Override + public boolean isBlocked() { + return true; + } + + @Override + public boolean isDomainBlocked() { + throw new AssertionError("not implemented"); + } + + @Override + public Jid getBlockedJid() { + return this.jid; + } + + @Override + public String getDisplayName() { + if (jid.isFullJid()) { + return jid.getResource(); + } else { + return jid.toEscapedString(); + } + } + + @Override + public int getOffline() { + return 0; + } + + @Override + public Jid getJid() { + return this.jid; + } + + @Override + public List<Tag> getTags(Context context) { + return Collections.emptyList(); + } + + @Override + public boolean match(Context context, String needle) { + if (TextUtils.isEmpty(needle)) { + return true; + } + needle = needle.toLowerCase(Locale.US).trim(); + String[] parts = needle.split("\\s+"); + for (String part : parts) { + if (!jid.toEscapedString().contains(part)) { + return false; + } + } + return true; + } + + @Override + public Account getAccount() { + return account; + } + + @Override + public int getAvatarBackgroundColor() { + return UIHelper.getColorForName(jid.toEscapedString()); + } + + @Override + public int compareTo(ListItem o) { + return this.getDisplayName().compareToIgnoreCase( + o.getDisplayName()); + } +}
\ No newline at end of file diff --git a/src/main/java/de/pixart/messenger/generator/IqGenerator.java b/src/main/java/de/pixart/messenger/generator/IqGenerator.java index 52f9f5b01..e533dd723 100644 --- a/src/main/java/de/pixart/messenger/generator/IqGenerator.java +++ b/src/main/java/de/pixart/messenger/generator/IqGenerator.java @@ -304,7 +304,7 @@ public class IqGenerator extends AbstractGenerator { public IqPacket generateSetBlockRequest(final Jid jid, boolean reportSpam) { final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); final Element block = iq.addChild("block", Namespace.BLOCKING); - final Element item = block.addChild("item").setAttribute("jid", jid.asBareJid().toString()); + final Element item = block.addChild("item").setAttribute("jid", jid.toEscapedString()); if (reportSpam) { item.addChild("report", "urn:xmpp:reporting:0").addChild("spam"); } @@ -315,7 +315,7 @@ public class IqGenerator extends AbstractGenerator { public IqPacket generateSetUnblockRequest(final Jid jid) { final IqPacket iq = new IqPacket(IqPacket.TYPE.SET); final Element block = iq.addChild("unblock", Namespace.BLOCKING); - block.addChild("item").setAttribute("jid", jid.asBareJid().toString()); + block.addChild("item").setAttribute("jid", jid.toEscapedString()); return iq; } diff --git a/src/main/java/de/pixart/messenger/parser/MessageParser.java b/src/main/java/de/pixart/messenger/parser/MessageParser.java index a0080e4da..d0831aef9 100644 --- a/src/main/java/de/pixart/messenger/parser/MessageParser.java +++ b/src/main/java/de/pixart/messenger/parser/MessageParser.java @@ -220,7 +220,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece service.reportBrokenSessionException(e, postpone); return new Message(conversation, "", Message.ENCRYPTION_AXOLOTL_FAILED, status); } else { - Log.d(Config.LOGTAG, "ignoring broken session exception because checkForDuplicase failed"); + Log.d(Config.LOGTAG, "ignoring broken session exception because checkForDuplicates failed"); + //TODO should be still emit a failed message? return null; } } catch (NotEncryptedForThisDeviceException e) { @@ -557,7 +558,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece fallbacksBySourceId = Collections.emptySet(); origin = from; } - + //TODO either or is probably fine? final boolean checkedForDuplicates = serverMsgId != null && remoteMsgId != null && !conversation.possibleDuplicate(serverMsgId, remoteMsgId); if (origin != null) { diff --git a/src/main/java/de/pixart/messenger/services/AvatarService.java b/src/main/java/de/pixart/messenger/services/AvatarService.java index c38fdcc99..a07b3a6e5 100644 --- a/src/main/java/de/pixart/messenger/services/AvatarService.java +++ b/src/main/java/de/pixart/messenger/services/AvatarService.java @@ -38,6 +38,7 @@ import de.pixart.messenger.entities.Conversational; import de.pixart.messenger.entities.ListItem; import de.pixart.messenger.entities.Message; import de.pixart.messenger.entities.MucOptions; +import de.pixart.messenger.entities.RawBlockable; import de.pixart.messenger.http.services.MuclumbusService; import de.pixart.messenger.utils.UIHelper; import de.pixart.messenger.xmpp.OnAdvancedStreamFeaturesLoaded; @@ -86,7 +87,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } else if (avatarable instanceof MuclumbusService.Room) { return get((MuclumbusService.Room) avatarable, size, cachedOnly); } - throw new AssertionError("AvatarService does not know how to generate avatar from "+avatarable.getClass().getName()); + throw new AssertionError("AvatarService does not know how to generate avatar from " + avatarable.getClass().getName()); } private Bitmap get(final MuclumbusService.Room result, final int size, boolean cacheOnly) { @@ -275,7 +276,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded { } public Bitmap get(ListItem item, int size, boolean cachedOnly) { - if (item instanceof Contact) { + if (item instanceof RawBlockable) { + return get(item.getDisplayName(), item.getJid().toEscapedString(), size, cachedOnly); + } else if (item instanceof Contact) { return get((Contact) item, size, cachedOnly); } else if (item instanceof Bookmark) { Bookmark bookmark = (Bookmark) item; diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index cb18a1d7e..a0d298d47 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -4606,17 +4606,15 @@ public class XmppConnectionService extends Service { public boolean sendBlockRequest(final Blockable blockable, boolean reportSpam) { if (blockable != null && blockable.getBlockedJid() != null) { final Jid jid = blockable.getBlockedJid(); - this.sendIqPacket(blockable.getAccount(), getIqGenerator().generateSetBlockRequest(jid, reportSpam), new OnIqPacketReceived() { - - @Override - public void onIqPacketReceived(final Account account, final IqPacket packet) { - if (packet.getType() == IqPacket.TYPE.RESULT) { - account.getBlocklist().add(jid); - updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED); - } + this.sendIqPacket(blockable.getAccount(), getIqGenerator().generateSetBlockRequest(jid, reportSpam), (a, response) -> { + if (response.getType() == IqPacket.TYPE.RESULT) { + a.getBlocklist().add(jid); + updateBlocklistUi(OnUpdateBlocklist.Status.BLOCKED); } }); - if (removeBlockedConversations(blockable.getAccount(), jid)) { + if (blockable.getBlockedJid().isFullJid()) { + return false; + } else if (removeBlockedConversations(blockable.getAccount(), jid)) { updateConversationUi(); return true; } else { diff --git a/src/main/java/de/pixart/messenger/ui/BlockContactDialog.java b/src/main/java/de/pixart/messenger/ui/BlockContactDialog.java index 4f768b009..562bf2efa 100644 --- a/src/main/java/de/pixart/messenger/ui/BlockContactDialog.java +++ b/src/main/java/de/pixart/messenger/ui/BlockContactDialog.java @@ -25,14 +25,18 @@ public final class BlockContactDialog { final String value; @StringRes int res; - if (blockable.getJid().getLocal() == null || blockable.getAccount().isBlocked(Jid.ofDomain(blockable.getJid().getDomain()))) { + if (blockable.getJid().isFullJid()) { + builder.setTitle(isBlocked ? R.string.action_unblock_participant : R.string.action_block_participant); + value = blockable.getJid().toEscapedString(); + res = isBlocked ? R.string.unblock_contact_text : R.string.block_contact_text; + } else if (blockable.getJid().getLocal() == null || blockable.getAccount().isBlocked(Jid.ofDomain(blockable.getJid().getDomain()))) { builder.setTitle(isBlocked ? R.string.action_unblock_domain : R.string.action_block_domain); value = Jid.ofDomain(blockable.getJid().getDomain()).toString(); res = isBlocked ? R.string.unblock_domain_text : R.string.block_domain_text; } else { int resBlockAction = blockable instanceof Conversation && ((Conversation) blockable).isWithStranger() ? R.string.block_stranger : R.string.action_block_contact; builder.setTitle(isBlocked ? R.string.action_unblock_contact : resBlockAction); - value = blockable.getJid().asBareJid().toString(); + value = blockable.getJid().asBareJid().toEscapedString(); res = isBlocked ? R.string.unblock_contact_text : R.string.block_contact_text; } binding.text.setText(JidDialog.style(xmppActivity, res, value)); diff --git a/src/main/java/de/pixart/messenger/ui/BlocklistActivity.java b/src/main/java/de/pixart/messenger/ui/BlocklistActivity.java index 49422583d..2927fe3e3 100644 --- a/src/main/java/de/pixart/messenger/ui/BlocklistActivity.java +++ b/src/main/java/de/pixart/messenger/ui/BlocklistActivity.java @@ -10,7 +10,10 @@ import java.util.Collections; import de.pixart.messenger.R; import de.pixart.messenger.entities.Account; +import de.pixart.messenger.entities.Blockable; import de.pixart.messenger.entities.Contact; +import de.pixart.messenger.entities.ListItem; +import de.pixart.messenger.entities.RawBlockable; import de.pixart.messenger.ui.interfaces.OnBackendConnected; import de.pixart.messenger.xmpp.OnUpdateBlocklist; import rocks.xmpp.addr.Jid; @@ -22,7 +25,7 @@ public class BlocklistActivity extends AbstractSearchableListItemActivity implem public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); getListView().setOnItemLongClickListener((parent, view, position, id) -> { - BlockContactDialog.show(BlocklistActivity.this, (Contact) getListItems().get(position)); + BlockContactDialog.show(BlocklistActivity.this, (Blockable) getListItems().get(position)); return true; }); this.binding.fab.show(); @@ -49,9 +52,14 @@ public class BlocklistActivity extends AbstractSearchableListItemActivity implem 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); + ListItem item; + if (jid.isFullJid()) { + item = new RawBlockable(account, jid); + } else { + item = account.getRoster().getContact(jid); + } + if (item.match(this, needle)) { + getListItems().add(item); } } Collections.sort(getListItems()); @@ -78,8 +86,8 @@ public class BlocklistActivity extends AbstractSearchableListItemActivity implem ); dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { - Contact contact = account.getRoster().getContact(contactJid); - if (xmppConnectionService.sendBlockRequest(contact, false)) { + Blockable blockable = new RawBlockable(account, contactJid); + if (xmppConnectionService.sendBlockRequest(blockable, false)) { Toast.makeText(BlocklistActivity.this, R.string.corresponding_conversations_closed, Toast.LENGTH_SHORT).show(); } return true; diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index ba865ca52..3407f6e9e 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -920,4 +920,6 @@ <string name="enable_message_encryption">This chat is unencrypted. For security reasons you should enable message encryption, preferable OMEMO. If anything isn\'t working for you, you could disable message encryption by pressing the key lock icon.</string> <string name="hide_warning">Hide warning</string> <string name="change_password_in_next_step">You can change the generated password in the next step to your needs.</string> + <string name="action_unblock_participant">Unblock participant</string> + <string name="action_block_participant">Block participant</string> </resources> |