optionally lock conference domains as well and hide known domains in ui

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/Config.java                       |  4 
src/main/java/eu/siacs/conversations/entities/Bookmark.java            | 13 
src/main/java/eu/siacs/conversations/entities/Contact.java             | 11 
src/main/java/eu/siacs/conversations/entities/ListItem.java            | 12 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java |  7 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java    |  8 
src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java            | 19 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java | 18 
src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java   |  4 
src/main/res/values/strings.xml                                        |  2 
10 files changed, 76 insertions(+), 22 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/Config.java 🔗

@@ -42,6 +42,10 @@ public final class Config {
 
 
 	public static final String DOMAIN_LOCK = null; //only allow account creation for this domain
+	public static final String CONFERENCE_DOMAIN_LOCK = null; //only allow conference creation for this domain
+	public static final boolean LOCK_DOMAINS_IN_CONVERSATIONS = false; //only add contacts and conferences for own domains
+
+
 	public static final boolean DISALLOW_REGISTRATION_IN_UI = false; //hide the register checkbox
 	public static final boolean ALLOW_NON_TLS_CONNECTIONS = false; //very dangerous. you should have a good reason to set this to true
 	public static final boolean FORCE_ORBOT = false; // always use TOR

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

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
+import eu.siacs.conversations.Config;
 import eu.siacs.conversations.utils.UIHelper;
 import eu.siacs.conversations.xml.Element;
 import eu.siacs.conversations.xmpp.jid.Jid;
@@ -57,6 +58,18 @@ public class Bookmark extends Element implements ListItem {
 		}
 	}
 
+	@Override
+	public String getDisplayJid() {
+		Jid jid = getJid();
+		if (Config.LOCK_DOMAINS_IN_CONVERSATIONS && jid != null && jid.getDomainpart().equals(Config.CONFERENCE_DOMAIN_LOCK)) {
+			return jid.getLocalpart();
+		} else if (jid != null) {
+			return jid.toString();
+		} else {
+			return null;
+		}
+	}
+
 	@Override
 	public Jid getJid() {
 		return this.getAttributeAsJid("jid");

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

@@ -121,6 +121,17 @@ public class Contact implements ListItem, Blockable {
 		}
 	}
 
+	@Override
+	public String getDisplayJid() {
+		if (Config.LOCK_DOMAINS_IN_CONVERSATIONS && jid != null && jid.getDomainpart().equals(Config.DOMAIN_LOCK)) {
+			return jid.getLocalpart();
+		} else if (jid != null) {
+			return jid.toString();
+		} else {
+			return null;
+		}
+	}
+
 	public String getProfilePhoto() {
 		return this.photoUri;
 	}

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

@@ -5,13 +5,15 @@ import java.util.List;
 import eu.siacs.conversations.xmpp.jid.Jid;
 
 public interface ListItem extends Comparable<ListItem> {
-	public String getDisplayName();
+	String getDisplayName();
 
-	public Jid getJid();
+	String getDisplayJid();
 
-	public List<Tag> getTags();
+	Jid getJid();
 
-	public final class Tag {
+	List<Tag> getTags();
+
+	final class Tag {
 		private final String name;
 		private final int color;
 
@@ -29,5 +31,5 @@ public interface ListItem extends Comparable<ListItem> {
 		}
 	}
 
-	public boolean match(final String needle);
+	boolean match(final String needle);
 }

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

@@ -6,7 +6,6 @@ import android.app.PendingIntent;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.IntentSender.SendIntentException;
-import android.graphics.Bitmap;
 import android.os.Build;
 import android.os.Bundle;
 import android.view.ContextMenu;
@@ -512,7 +511,11 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 		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());
+		if (Config.LOCK_DOMAINS_IN_CONVERSATIONS && mConversation.getJid().getDomainpart().equals(Config.CONFERENCE_DOMAIN_LOCK)) {
+			mFullJid.setText(mConversation.getJid().getLocalpart());
+		} else {
+			mFullJid.setText(mConversation.getJid().toBareJid().toString());
+		}
 		mYourNick.setText(mucOptions.getActualNick());
 		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
 		if (mucOptions.online()) {

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

@@ -139,7 +139,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 						ContactDetailsActivity.this);
 				builder.setTitle(getString(R.string.action_add_phone_book));
 				builder.setMessage(getString(R.string.add_phone_book_text,
-						contact.getJid()));
+						contact.getDisplayJid()));
 				builder.setNegativeButton(getString(R.string.cancel), null);
 				builder.setPositiveButton(getString(R.string.add), addToPhonebook);
 				builder.create().show();
@@ -236,7 +236,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 				builder.setTitle(getString(R.string.action_delete_contact))
 					.setMessage(
 							getString(R.string.remove_contact_text,
-								contact.getJid()))
+								contact.getDisplayJid()))
 					.setPositiveButton(getString(R.string.delete),
 							removeFromRoster).create().show();
 				break;
@@ -358,10 +358,10 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 		}
 
 		if (contact.getPresences().size() > 1) {
-			contactJidTv.setText(contact.getJid() + " ("
+			contactJidTv.setText(contact.getDisplayJid() + " ("
 					+ contact.getPresences().size() + ")");
 		} else {
-			contactJidTv.setText(contact.getJid().toString());
+			contactJidTv.setText(contact.getDisplayJid());
 		}
 		String account;
 		if (Config.DOMAIN_LOCK != null) {

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

@@ -2,13 +2,12 @@ package eu.siacs.conversations.ui;
 
 import android.app.AlertDialog;
 import android.content.Context;
-import android.content.DialogInterface.OnClickListener;
-import android.content.DialogInterface;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.widget.ArrayAdapter;
 import android.widget.AutoCompleteTextView;
 import android.widget.Spinner;
+import android.widget.TextView;
 
 import java.util.List;
 
@@ -44,12 +43,17 @@ public class EnterJidDialog {
 		final String title, final String positiveButton,
 		final String prefilledJid, final String account, boolean allowEditJid
 	) {
+		final boolean lock = Config.LOCK_DOMAINS_IN_CONVERSATIONS && Config.DOMAIN_LOCK != null;
 		AlertDialog.Builder builder = new AlertDialog.Builder(context);
 		builder.setTitle(title);
 		View dialogView = LayoutInflater.from(context).inflate(R.layout.enter_jid_dialog, null);
+		final TextView jabberIdDesc = (TextView) dialogView.findViewById(R.id.jabber_id);
+		jabberIdDesc.setText(lock ? R.string.username : R.string.account_settings_jabber_id);
 		final Spinner spinner = (Spinner) dialogView.findViewById(R.id.account);
 		final AutoCompleteTextView jid = (AutoCompleteTextView) dialogView.findViewById(R.id.jid);
-		jid.setAdapter(new KnownHostsAdapter(context,android.R.layout.simple_list_item_1, knownHosts));
+		if (!lock) {
+			jid.setAdapter(new KnownHostsAdapter(context, android.R.layout.simple_list_item_1, knownHosts));
+		}
 		if (prefilledJid != null) {
 			jid.append(prefilledJid);
 			if (!allowEditJid) {
@@ -60,6 +64,7 @@ public class EnterJidDialog {
 			}
 		}
 
+		jid.setHint(Config.LOCK_DOMAINS_IN_CONVERSATIONS && Config.DOMAIN_LOCK != null ? R.string.username_hint : R.string.account_settings_example_jabber_id);
 
 		if (account == null) {
 			StartConversationActivity.populateAccountSpinner(context, activatedAccounts, spinner);
@@ -95,9 +100,13 @@ public class EnterJidDialog {
 				}
 				final Jid contactJid;
 				try {
-					contactJid = Jid.fromString(jid.getText().toString());
+					if (lock) {
+						contactJid = Jid.fromParts(jid.getText().toString(), Config.DOMAIN_LOCK, null);
+					} else {
+						contactJid = Jid.fromString(jid.getText().toString());
+					}
 				} catch (final InvalidJidException e) {
-					jid.setError(context.getString(R.string.invalid_jid));
+					jid.setError(context.getString(lock ? R.string.invalid_username : R.string.invalid_jid));
 					return;
 				}
 

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

@@ -44,6 +44,7 @@ import android.widget.Checkable;
 import android.widget.EditText;
 import android.widget.ListView;
 import android.widget.Spinner;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import com.google.zxing.integration.android.IntentIntegrator;
@@ -64,7 +65,6 @@ import eu.siacs.conversations.entities.Contact;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.ListItem;
 import eu.siacs.conversations.entities.Presence;
-import eu.siacs.conversations.entities.Presences;
 import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate;
 import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
 import eu.siacs.conversations.ui.adapter.ListItemAdapter;
@@ -390,7 +390,13 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 		final View dialogView = getLayoutInflater().inflate(R.layout.join_conference_dialog, null);
 		final Spinner spinner = (Spinner) dialogView.findViewById(R.id.account);
 		final AutoCompleteTextView jid = (AutoCompleteTextView) dialogView.findViewById(R.id.jid);
-		jid.setAdapter(new KnownHostsAdapter(this, android.R.layout.simple_list_item_1, mKnownConferenceHosts));
+		final boolean lock = Config.LOCK_DOMAINS_IN_CONVERSATIONS && Config.CONFERENCE_DOMAIN_LOCK != null;
+		final TextView jabberIdDesc = (TextView) dialogView.findViewById(R.id.jabber_id);
+		jabberIdDesc.setText(lock ? R.string.conference_name : R.string.conference_address);
+		jid.setHint(lock ? R.string.conference_name : R.string.conference_address_example);
+		if (!lock) {
+			jid.setAdapter(new KnownHostsAdapter(this, android.R.layout.simple_list_item_1, mKnownConferenceHosts));
+		}
 		if (prefilledJid != null) {
 			jid.append(prefilledJid);
 		}
@@ -416,9 +422,13 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 						}
 						final Jid conferenceJid;
 						try {
-							conferenceJid = Jid.fromString(jid.getText().toString());
+							if (lock) {
+								conferenceJid = Jid.fromParts(jid.getText().toString(),Config.CONFERENCE_DOMAIN_LOCK, null);
+							} else {
+								conferenceJid = Jid.fromString(jid.getText().toString());
+							}
 						} catch (final InvalidJidException e) {
-							jid.setError(getString(R.string.invalid_jid));
+							jid.setError(getString(lock ? R.string.invalid_conference_name : R.string.invalid_jid));
 							return;
 						}
 

src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java 🔗

@@ -76,10 +76,10 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
 				tagLayout.addView(tv);
 			}
 		}
-		final Jid jid = item.getJid();
+		final String jid = item.getDisplayJid();
 		if (jid != null) {
 			tvJid.setVisibility(View.VISIBLE);
-			tvJid.setText(jid.toString());
+			tvJid.setText(jid);
 		} else {
 			tvJid.setVisibility(View.GONE);
 		}

src/main/res/values/strings.xml 🔗

@@ -522,6 +522,8 @@
 	<string name="username">Username</string>
 	<string name="username_hint">Username</string>
 	<string name="invalid_username">This is not a valid username</string>
+	<string name="conference_name">Conference name</string>
+	<string name="invalid_conference_name">This is not a valid conference name</string>
 	<string name="download_failed_server_not_found">Download failed: Server not found</string>
 	<string name="download_failed_file_not_found">Download failed: File not found</string>
 	<string name="download_failed_could_not_connect">Download failed: Could not connect to host</string>