Make text-multi and multi-jid work at all

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java | 33 ++
1 file changed, 27 insertions(+), 6 deletions(-)

Detailed changes

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

@@ -2184,11 +2184,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                     super(binding);
                     binding.textinput.addTextChangedListener(this);
                 }
-                protected Element mValue = null;
+                protected Field field = null;
 
                 @Override
                 public void bind(Item item) {
-                    Field field = (Field) item;
+                    field = (Field) item;
                     binding.textinputLayout.setHint(field.getLabel().or(""));
 
                     binding.textinputLayout.setHelperTextEnabled(field.getDesc().isPresent());
@@ -2211,16 +2211,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                     String prefixLabel = field.el.findChildContent("x", "https://ns.cheogram.com/prefix-label");
                     binding.textinputLayout.setPrefixText(prefixLabel == null ? "" : prefixLabel);
 
-                    mValue = field.getValue();
-                    binding.textinput.setText(mValue.getContent());
+                    binding.textinput.setText(String.join("\n", field.getValues()));
                     setupInputType(field.el, binding.textinput, binding.textinputLayout);
                 }
 
                 @Override
                 public void afterTextChanged(Editable s) {
-                    if (mValue == null) return;
+                    if (field == null) return;
 
-                    mValue.setContent(s.toString());
+                    field.setValues(List.of(s.toString().split("\n")));
                 }
 
                 @Override
@@ -2347,6 +2346,28 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                     return value;
                 }
 
+                public void setValues(List<String> values) {
+                    for(Element child : el.getChildren()) {
+                        if ("value".equals(child.getName()) && "jabber:x:data".equals(child.getNamespace())) {
+                            el.removeChild(child);
+                        }
+                    }
+
+                    for (String value : values) {
+                        el.addChild("value", "jabber:x:data").setContent(value);
+                    }
+                }
+
+                public List<String> getValues() {
+                    List<String> values = new ArrayList<>();
+                    for(Element child : el.getChildren()) {
+                        if ("value".equals(child.getName()) && "jabber:x:data".equals(child.getNamespace())) {
+                            values.add(child.getContent());
+                        }
+                    }
+                    return values;
+                }
+
                 public List<Option> getOptions() {
                     return Option.forField(el);
                 }