support for jid escapting when displaying localpart only

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Contact.java             |  2 
src/main/java/eu/siacs/conversations/entities/Conversation.java        |  2 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java |  2 
src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java                 | 14 
4 files changed, 17 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Contact.java 🔗

@@ -121,7 +121,7 @@ public class Contact implements ListItem, Blockable {
 		} else if (this.presenceName != null && mutualPresenceSubscription()) {
 			return this.presenceName;
 		} else if (jid.hasLocalpart()) {
-			return jid.getLocalpart();
+			return jid.getUnescapedLocalpart();
 		} else {
 			return jid.getDomainpart();
 		}

src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java 🔗

@@ -380,7 +380,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 				MenuItem invite = menu.findItem(R.id.invite);
 				startConversation.setVisible(true);
 				if (contact != null) {
-					showContactDetails.setVisible(true);
+					showContactDetails.setVisible(!contact.isSelf());
 				}
 				if (user.getRole() == MucOptions.Role.NONE) {
 					invite.setVisible(true);

src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java 🔗

@@ -21,6 +21,8 @@ public final class Jid {
 	private final String domainpart;
 	private final String resourcepart;
 
+	private static final char[] JID_ESCAPING_CHARS = {' ','"','&','\'','/',':','<','>','@','\\'};
+
 	// It's much more efficient to store the ful JID as well as the parts instead of figuring them
 	// all out every time (since some characters are displayed but aren't used for comparisons).
 	private final String displayjid;
@@ -29,6 +31,18 @@ public final class Jid {
 		return localpart;
 	}
 
+	public String getUnescapedLocalpart() {
+		if (localpart == null || !localpart.contains("\\")) {
+			return localpart;
+		} else {
+			String localpart = this.localpart;
+			for(char c : JID_ESCAPING_CHARS) {
+				localpart = localpart.replace(String.format ("\\%02x", (int)c),String.valueOf(c));
+			}
+			return localpart;
+		}
+	}
+
 	public String getDomainpart() {
 		return IDN.toUnicode(domainpart);
 	}