diff --git a/src/cheogram/res/layout/command_checkbox_field.xml b/src/cheogram/res/layout/command_checkbox_field.xml
new file mode 100644
index 0000000000000000000000000000000000000000..520a05d1922894fe25befa2794faaf66011e6a29
--- /dev/null
+++ b/src/cheogram/res/layout/command_checkbox_field.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index c79685df5806334eb560ba658aaafef971f0800b..7e42aca507be84850c53c92a7368662004174292 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -11,6 +11,7 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
+import android.widget.CompoundButton;
import android.webkit.WebView;
import android.webkit.WebViewClient;
@@ -45,6 +46,7 @@ import eu.siacs.conversations.crypto.PgpDecryptionService;
import eu.siacs.conversations.databinding.CommandPageBinding;
import eu.siacs.conversations.databinding.CommandNoteBinding;
import eu.siacs.conversations.databinding.CommandResultFieldBinding;
+import eu.siacs.conversations.databinding.CommandCheckboxFieldBinding;
import eu.siacs.conversations.databinding.CommandTextFieldBinding;
import eu.siacs.conversations.databinding.CommandWebviewBinding;
import eu.siacs.conversations.persistance.DatabaseBackend;
@@ -1374,6 +1376,47 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
}
}
+ class CheckboxFieldViewHolder extends ViewHolder implements CompoundButton.OnCheckedChangeListener {
+ public CheckboxFieldViewHolder(CommandCheckboxFieldBinding binding) {
+ super(binding);
+ binding.row.setOnClickListener((v) -> {
+ binding.checkbox.toggle();
+ });
+ binding.checkbox.setOnCheckedChangeListener(this);
+ }
+ protected Element mValue = null;
+
+ @Override
+ public void bind(Element field) {
+ String label = field.getAttribute("label");
+ if (label == null) label = field.getAttribute("var");
+ if (label == null) label = "";
+ binding.label.setText(label);
+
+ String desc = field.findChildContent("desc", "jabber:x:data");
+ if (desc == null) {
+ binding.desc.setVisibility(View.GONE);
+ } else {
+ binding.desc.setVisibility(View.VISIBLE);
+ binding.desc.setText(desc);
+ }
+
+ mValue = field.findChild("value", "jabber:x:data");
+ if (mValue == null) {
+ mValue = field.addChild("value", "jabber:x:data");
+ }
+
+ binding.checkbox.setChecked(mValue.getContent() != null && (mValue.getContent().equals("true") || mValue.getContent().equals("1")));
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton checkbox, boolean isChecked) {
+ if (mValue == null) return;
+
+ mValue.setContent(isChecked ? "true" : "false");
+ }
+ }
+
class TextFieldViewHolder extends ViewHolder implements TextWatcher {
public TextFieldViewHolder(CommandTextFieldBinding binding) {
super(binding);
@@ -1469,6 +1512,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
final int TYPE_WEB = 3;
final int TYPE_RESULT_FIELD = 4;
final int TYPE_TEXT_FIELD = 5;
+ final int TYPE_CHECKBOX_FIELD = 6;
protected String mTitle;
protected CommandPageBinding mBinding = null;
@@ -1581,7 +1625,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
String formType = responseElement.getAttribute("type");
String fieldType = item.getAttribute("type");
if (formType.equals("result") || fieldType.equals("fixed")) return TYPE_RESULT_FIELD;
- if (formType.equals("form")) return TYPE_TEXT_FIELD;
+ if (formType.equals("form")) {
+ if (fieldType.equals("boolean")) return TYPE_CHECKBOX_FIELD;
+
+ return TYPE_TEXT_FIELD;
+ }
}
return -1;
} else {
@@ -1608,6 +1656,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
CommandResultFieldBinding binding = DataBindingUtil.inflate(LayoutInflater.from(container.getContext()), R.layout.command_result_field, container, false);
return new ResultFieldViewHolder(binding);
}
+ case TYPE_CHECKBOX_FIELD: {
+ CommandCheckboxFieldBinding binding = DataBindingUtil.inflate(LayoutInflater.from(container.getContext()), R.layout.command_checkbox_field, container, false);
+ return new CheckboxFieldViewHolder(binding);
+ }
case TYPE_TEXT_FIELD: {
CommandTextFieldBinding binding = DataBindingUtil.inflate(LayoutInflater.from(container.getContext()), R.layout.command_text_field, container, false);
return new TextFieldViewHolder(binding);