package com.vijay.jsonwizard.presenters; import android.annotation.SuppressLint; import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.provider.MediaStore; import android.view.View; import android.widget.AdapterView; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.Toast; import com.rengwuxian.materialedittext.MaterialEditText; import com.vijay.jsonwizard.R; import com.vijay.jsonwizard.constants.JsonFormConstants; import com.vijay.jsonwizard.customviews.CheckBox; import com.vijay.jsonwizard.customviews.RadioButton; import com.vijay.jsonwizard.fragments.JsonFormFragment; import com.vijay.jsonwizard.interactors.JsonFormInteractor; import com.vijay.jsonwizard.mvp.MvpBasePresenter; import com.vijay.jsonwizard.utils.ImageUtils; import com.vijay.jsonwizard.utils.ValidationStatus; import com.vijay.jsonwizard.views.JsonFormFragmentView; import com.vijay.jsonwizard.viewstates.JsonFormFragmentViewState; import com.vijay.jsonwizard.widgets.EditTextFactory; import com.vijay.jsonwizard.widgets.ImagePickerFactory; import com.vijay.jsonwizard.widgets.SpinnerFactory; import org.json.JSONException; import org.json.JSONObject; import java.util.List; import fr.ganfra.materialspinner.MaterialSpinner; import static com.vijay.jsonwizard.utils.FormUtils.dpToPixels; /** * Created by vijay on 5/14/15. */ public class JsonFormFragmentPresenter extends MvpBasePresenter<JsonFormFragmentView<JsonFormFragmentViewState>> { private static final String TAG = "FormFragmentPresenter"; private static final int RESULT_LOAD_IMG = 1; private String mStepName; private JSONObject mStepDetails; private String mCurrentKey; private JsonFormInteractor mJsonFormInteractor = JsonFormInteractor.getInstance(); public void addFormElements() { mStepName = getView().getArguments().getString("stepName"); JSONObject step = getView().getStep(mStepName); try { mStepDetails = new JSONObject(step.toString()); } catch (JSONException e) { e.printStackTrace(); } List<View> views = mJsonFormInteractor.fetchFormElements(mStepName, getView().getContext(), mStepDetails, getView().getCommonListener()); getView().addFormElements(views); } @SuppressLint("ResourceAsColor") public void setUpToolBar() { if (!mStepName.equals(JsonFormConstants.FIRST_STEP_NAME)) { getView().setUpBackButton(); } getView().setActionBarTitle(mStepDetails.optString("title")); if (mStepDetails.has("next")) { getView().updateVisibilityOfNextAndSave(true, false); } else { getView().updateVisibilityOfNextAndSave(false, true); } getView().setToolbarTitleColor(R.color.white); } public void onBackClick() { getView().hideKeyBoard(); getView().backClick(); } public void onNextClick(LinearLayout mainView) { ValidationStatus validationStatus = writeValuesAndValidate(mainView); if (validationStatus.isValid()) { JsonFormFragment next = JsonFormFragment.getFormFragment(mStepDetails.optString("next")); getView().hideKeyBoard(); getView().transactThis(next); } else { getView().showToast(validationStatus.getErrorMessage()); } } public ValidationStatus writeValuesAndValidate(LinearLayout mainView) { int childCount = mainView.getChildCount(); for (int i = 0; i < childCount; i++) { View childAt = mainView.getChildAt(i); String key = (String) childAt.getTag(R.id.key); if (childAt instanceof MaterialEditText) { MaterialEditText editText = (MaterialEditText) childAt; ValidationStatus validationStatus = EditTextFactory.validate(editText); if (!validationStatus.isValid()) { return validationStatus; } getView().writeValue(mStepName, key, editText.getText().toString()); } else if (childAt instanceof ImageView) { ValidationStatus validationStatus = ImagePickerFactory.validate((ImageView) childAt); if (!validationStatus.isValid()) { return validationStatus; } Object path = childAt.getTag(R.id.imagePath); if (path instanceof String) { getView().writeValue(mStepName, key, (String) path); } } else if (childAt instanceof CheckBox) { String parentKey = (String) childAt.getTag(R.id.key); String childKey = (String) childAt.getTag(R.id.childKey); getView().writeValue(mStepName, parentKey, JsonFormConstants.OPTIONS_FIELD_NAME, childKey, String.valueOf(((CheckBox) childAt).isChecked())); } else if (childAt instanceof RadioButton) { String parentKey = (String) childAt.getTag(R.id.key); String childKey = (String) childAt.getTag(R.id.childKey); if (((RadioButton) childAt).isChecked()) { getView().writeValue(mStepName, parentKey, childKey); } } else if (childAt instanceof MaterialSpinner) { MaterialSpinner spinner = (MaterialSpinner) childAt; ValidationStatus validationStatus = SpinnerFactory.validate(spinner); if (!validationStatus.isValid()) { spinner.setError(validationStatus.getErrorMessage()); return validationStatus; } else { spinner.setError(null); } } } return new ValidationStatus(true, null); } public void onSaveClick(LinearLayout mainView) { ValidationStatus validationStatus = writeValuesAndValidate(mainView); if (validationStatus.isValid()) { Intent returnIntent = new Intent(); returnIntent.putExtra("json", getView().getCurrentJsonState()); getView().finishWithResult(returnIntent); } else { Toast.makeText(getView().getContext(), validationStatus.getErrorMessage(), Toast.LENGTH_LONG); } } public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_LOAD_IMG && resultCode == Activity.RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; // No need for null check on cursor Cursor cursor = getView().getContext().getContentResolver() .query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String imagePath = cursor.getString(columnIndex); getView().updateRelevantImageView(ImageUtils.loadBitmapFromFile(imagePath, ImageUtils.getDeviceWidth(getView().getContext()), dpToPixels(getView().getContext(), 200)), imagePath, mCurrentKey); cursor.close(); } } public void onClick(View v) { String key = (String) v.getTag(R.id.key); String type = (String) v.getTag(R.id.type); if (JsonFormConstants.CHOOSE_IMAGE.equals(type)) { getView().hideKeyBoard(); Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); mCurrentKey = key; getView().startActivityForResult(galleryIntent, RESULT_LOAD_IMG); } } public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { if (compoundButton instanceof CheckBox) { String parentKey = (String) compoundButton.getTag(R.id.key); String childKey = (String) compoundButton.getTag(R.id.childKey); getView().writeValue(mStepName, parentKey, JsonFormConstants.OPTIONS_FIELD_NAME, childKey, String.valueOf(((CheckBox) compoundButton).isChecked())); } else if (compoundButton instanceof RadioButton) { if (isChecked) { String parentKey = (String) compoundButton.getTag(R.id.key); String childKey = (String) compoundButton.getTag(R.id.childKey); getView().unCheckAllExcept(parentKey, childKey); getView().writeValue(mStepName, parentKey, childKey); } } } public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { String parentKey = (String) parent.getTag(R.id.key); if (position >= 0) { String value = (String) parent.getItemAtPosition(position + 1); getView().writeValue(mStepName, parentKey, value); } } }