FormFieldWrapper.java

 1package eu.siacs.conversations.ui.forms;
 2
 3import android.content.Context;
 4import android.text.SpannableString;
 5import android.text.style.ForegroundColorSpan;
 6import android.text.style.StyleSpan;
 7import android.util.Log;
 8import android.view.LayoutInflater;
 9import android.view.View;
10
11import java.util.List;
12
13import eu.siacs.conversations.Config;
14import eu.siacs.conversations.R;
15import eu.siacs.conversations.xmpp.forms.Field;
16
17public abstract class FormFieldWrapper {
18
19	protected final Context context;
20	protected final Field field;
21	protected final View view;
22	protected OnFormFieldValuesEdited onFormFieldValuesEditedListener;
23
24	protected FormFieldWrapper(Context context, Field field) {
25		this.context = context;
26		this.field = field;
27		LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
28		this.view = inflater.inflate(getLayoutResource(), null);
29		String label = field.getLabel();
30		if (label == null) {
31			label = field.getFieldName();
32		}
33		setLabel(label, field.isRequired());
34	}
35
36	public final void submit() {
37		this.field.setValues(getValues());
38	}
39
40	public final View getView() {
41		return view;
42	}
43
44	protected abstract void setLabel(String label, boolean required);
45
46	abstract List<String> getValues();
47
48	abstract boolean validates();
49
50	abstract protected int getLayoutResource();
51
52	protected SpannableString createSpannableLabelString(String label, boolean required) {
53		SpannableString spannableString = new SpannableString(label + (required ? " *" : ""));
54		if (required) {
55			int start = label.length();
56			int end = label.length() + 2;
57			spannableString.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), start, end, 0);
58			spannableString.setSpan(new ForegroundColorSpan(context.getResources().getColor(R.color.accent)), start, end, 0);
59		}
60		return spannableString;
61	}
62
63	protected void invokeOnFormFieldValuesEdited() {
64		Log.d(Config.LOGTAG, "invoke on form field values edited");
65		if (this.onFormFieldValuesEditedListener != null) {
66			this.onFormFieldValuesEditedListener.onFormFieldValuesEdited();
67		} else {
68			Log.d(Config.LOGTAG,"listener is null");
69		}
70	}
71
72	public boolean edited() {
73		return !field.getValues().equals(getValues());
74	}
75
76	public void setOnFormFieldValuesEditedListener(OnFormFieldValuesEdited listener) {
77		this.onFormFieldValuesEditedListener = listener;
78	}
79
80	protected static <F extends FormFieldWrapper> FormFieldWrapper createFromField(Class<F> c, Context context, Field field) {
81		try {
82			return c.getDeclaredConstructor(Context.class, Field.class).newInstance(context,field);
83		} catch (Exception e) {
84			e.printStackTrace();
85			return null;
86		}
87	}
88
89	public interface OnFormFieldValuesEdited {
90		void onFormFieldValuesEdited();
91	}
92}