package com.vijay.jsonwizard.widgets;
import android.content.Context;
import android.text.InputType;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.LayoutInflater;
import android.view.View;
import com.rengwuxian.materialedittext.MaterialEditText;
import com.rengwuxian.materialedittext.validation.RegexpValidator;
import com.rey.material.util.ViewUtil;
import com.vijay.jsonwizard.R;
import com.vijay.jsonwizard.customviews.GenericTextWatcher;
import com.vijay.jsonwizard.interfaces.CommonListener;
import com.vijay.jsonwizard.interfaces.FormWidgetFactory;
import com.vijay.jsonwizard.utils.ValidationStatus;
import com.vijay.jsonwizard.validators.edittext.MaxLengthValidator;
import com.vijay.jsonwizard.validators.edittext.MinLengthValidator;
import com.vijay.jsonwizard.validators.edittext.RequiredValidator;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
/**
* Created by vijay on 24-05-2015.
*/
public class EditTextFactory implements FormWidgetFactory {
public static final int MIN_LENGTH = 0;
public static final int MAX_LENGTH = 100;
@Override
public List<View> getViewsFromJson(String stepName, Context context, JSONObject jsonObject, CommonListener listener) throws Exception {
int minLength = MIN_LENGTH;
int maxLength= MAX_LENGTH;
List<View> views = new ArrayList<>(1);
MaterialEditText editText = (MaterialEditText) LayoutInflater.from(context).inflate(
R.layout.item_edit_text, null);
editText.setHint(jsonObject.getString("hint"));
editText.setFloatingLabelText(jsonObject.getString("hint"));
editText.setId(ViewUtil.generateViewId());
editText.setTag(R.id.key, jsonObject.getString("key"));
editText.setTag(R.id.type, jsonObject.getString("type"));
if (!TextUtils.isEmpty(jsonObject.optString("value"))) {
editText.setText(jsonObject.optString("value"));
}
//add validators
JSONObject requiredObject = jsonObject.optJSONObject("v_required");
if(requiredObject != null) {
String requiredValue = requiredObject.getString("value");
if (!TextUtils.isEmpty(requiredValue)) {
if (Boolean.TRUE.toString().equalsIgnoreCase(requiredValue)) {
editText.addValidator(new RequiredValidator(requiredObject.getString("err")));
}
}
}
JSONObject minLengthObject = jsonObject.optJSONObject("v_min_length");
if(minLengthObject != null) {
String minLengthValue = minLengthObject.optString("value");
if (!TextUtils.isEmpty(minLengthValue)) {
minLength = Integer.parseInt(minLengthValue);
editText.addValidator(new MinLengthValidator(minLengthObject.getString("err"), Integer.parseInt(minLengthValue)));
}
}
JSONObject maxLengthObject = jsonObject.optJSONObject("v_max_length");
if(maxLengthObject != null) {
String maxLengthValue = maxLengthObject.optString("value");
if (!TextUtils.isEmpty(maxLengthValue)) {
maxLength = Integer.parseInt(maxLengthValue);
editText.addValidator(new MaxLengthValidator(maxLengthObject.getString("err"), Integer.parseInt(maxLengthValue)));
}
}
editText.setMaxCharacters(maxLength);
editText.setMinCharacters(minLength);
JSONObject regexObject = jsonObject.optJSONObject("v_regex");
if(regexObject != null) {
String regexValue = regexObject.optString("value");
if (!TextUtils.isEmpty(regexValue)) {
editText.addValidator(new RegexpValidator(regexObject.getString("err"), regexValue));
}
}
JSONObject emailObject = jsonObject.optJSONObject("v_email");
if(emailObject != null) {
String emailValue = emailObject.optString("value");
if (!TextUtils.isEmpty(emailValue)) {
if (Boolean.TRUE.toString().equalsIgnoreCase(emailValue)) {
editText.addValidator(new RegexpValidator(emailObject.getString("err"), android.util.Patterns.EMAIL_ADDRESS.toString()));
}
}
}
JSONObject urlObject = jsonObject.optJSONObject("v_url");
if(urlObject != null) {
String urlValue = urlObject.optString("value");
if (!TextUtils.isEmpty(urlValue)) {
if (Boolean.TRUE.toString().equalsIgnoreCase(urlValue)) {
editText.addValidator(new RegexpValidator(urlObject.getString("err"), Patterns.WEB_URL.toString()));
}
}
}
JSONObject numericObject = jsonObject.optJSONObject("v_numeric");
if(numericObject != null) {
String numericValue = numericObject.optString("value");
if (!TextUtils.isEmpty(numericValue)) {
if (Boolean.TRUE.toString().equalsIgnoreCase(numericValue)) {
editText.addValidator(new RegexpValidator(numericObject.getString("err"), "[0-9]+"));
}
}
}
// edit type check
String editType = jsonObject.optString("edit_type");
if (!TextUtils.isEmpty(editType)) {
if (editType.equals("number")) {
editText.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);
}
}
editText.addTextChangedListener(new GenericTextWatcher(stepName, editText));
views.add(editText);
return views;
}
public static ValidationStatus validate(MaterialEditText editText) {
boolean validate = editText.validate();
if(!validate) {
return new ValidationStatus(false, editText.getError().toString());
}
return new ValidationStatus(true, null);
}
}