diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java index 42287b5d2..2be60f2fa 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormActivity.java @@ -372,41 +372,37 @@ public Pair getCalculationAddressAndValue(View view) throw @Override public void refreshCalculationLogic(String parentKey, String childKey, boolean popup, String stepName, boolean isForNextStep) { - appExecutors.diskIO().execute(() ->{ - Set viewsIds = calculationDependencyMap.get(stepName + "_" + parentKey); - if (parentKey == null || viewsIds == null) - viewsIds = calculationLogicViews.keySet(); - for (String viewId : viewsIds) { - try { - View curView = calculationLogicViews.get(viewId); - if (curView == null) { - Timber.w("calculationLogicViews Missing %s", viewId); - continue; + Set viewsIds = calculationDependencyMap.get(stepName + "_" + parentKey); + if (parentKey == null || viewsIds == null) + viewsIds = calculationLogicViews.keySet(); + for (String viewId : viewsIds) { + try { + View curView = calculationLogicViews.get(viewId); + if (curView == null) { + Timber.w("calculationLogicViews Missing %s", viewId); + continue; + } + Pair addressAndValue = getCalculationAddressAndValue(curView); + if (addressAndValue != null && addressAndValue.first != null) { + String[] address = addressAndValue.first; + JSONObject valueSource = addressAndValue.second; + Facts curValueMap; + if (valueSource.length() > 0) { + curValueMap = getValueFromAddress(address, popup, valueSource); + } else { + curValueMap = getValueFromAddress(address, popup); } - Pair addressAndValue = getCalculationAddressAndValue(curView); - if (addressAndValue != null && addressAndValue.first != null) { - String[] address = addressAndValue.first; - JSONObject valueSource = addressAndValue.second; - Facts curValueMap; - if (valueSource.length() > 0) { - curValueMap = getValueFromAddress(address, popup, valueSource); - } else { - curValueMap = getValueFromAddress(address, popup); - } - //update ui - appExecutors.mainThread().execute(() -> { - updateCalculation(curValueMap, curView, address, isForNextStep); - }); + //update ui + updateCalculation(curValueMap, curView, address, isForNextStep); - } + } - } catch (Exception e) { - Timber.e(e, "%s refreshCalculationLogic()", this.getClass().getCanonicalName()); + } catch (Exception e) { + Timber.e(e, "%s refreshCalculationLogic()", this.getClass().getCanonicalName()); - } } + } - }); } @@ -629,26 +625,24 @@ public JSONObject getObjectUsingAddress(String[] address, boolean popup, JSONObj */ @Override public void refreshConstraints(String parentKey, String childKey, boolean popup) { - appExecutors.diskIO().execute(()->{ - initComparisons(); + initComparisons(); - // Priorities constraints on the view that has just been changed - String changedViewKey = parentKey; - if (changedViewKey != null && childKey != null) { - changedViewKey = changedViewKey + ":" + childKey; - } + // Priorities constraints on the view that has just been changed + String changedViewKey = parentKey; + if (changedViewKey != null && childKey != null) { + changedViewKey = changedViewKey + ":" + childKey; + } - if (changedViewKey != null && (constrainedViews != null && constrainedViews.containsKey(changedViewKey))) { - checkViewConstraints(constrainedViews.get(changedViewKey), popup); - } + if (changedViewKey != null && (constrainedViews != null && constrainedViews.containsKey(changedViewKey))) { + checkViewConstraints(constrainedViews.get(changedViewKey), popup); + } - for (View curView : constrainedViews.values()) { - String viewKey = getViewKey(curView); - if (changedViewKey == null || (!TextUtils.isEmpty(viewKey) && !viewKey.equals(changedViewKey))) { - checkViewConstraints(curView, popup); - } + for (View curView : constrainedViews.values()) { + String viewKey = getViewKey(curView); + if (changedViewKey == null || (!TextUtils.isEmpty(viewKey) && !viewKey.equals(changedViewKey))) { + checkViewConstraints(curView, popup); } - }); + } } diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormBaseActivity.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormBaseActivity.java index c1f9aaa5f..525c7d539 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormBaseActivity.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/activities/JsonFormBaseActivity.java @@ -188,6 +188,10 @@ public void setmJSONObject(JSONObject mJSONObject) { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + Timber.e("JsonFromBaseActivity optib requestCode %s resultCode %s", requestCode, resultCode); + if(data != null) + Timber.e(" data %s",data.getStringExtra(Intent.EXTRA_TEXT)); + else Timber.e("JsonFormBaseActivity data is null"); if (onActivityResultListeners.containsKey(requestCode)) { onActivityResultListeners.get(requestCode).onActivityResult(requestCode, resultCode, data); } else { diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java index 1a9b69aed..d9190ca03 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/constants/JsonFormConstants.java @@ -57,6 +57,7 @@ public class JsonFormConstants { public static final String BEHAVIOUR = "behaviour"; public static final String RESULT = "result"; public static final String VALUE = "value"; + public static final String V_EQUALS = "v_equals"; public static final String KEYS = "keys"; public static final String SECOND_VALUE = "second_value"; public static final String OPENMRS_ENTITY_PARENT = "openmrs_entity_parent"; @@ -148,6 +149,7 @@ public class JsonFormConstants { public static final String EXPANDED = "expanded"; public static final String EXPAND_ON_TEXT_CHANGE = "expand_on_text_change"; public static final String NUMBER = "number"; + public static final String PASSWORD = "password"; public static final String TOP_MARGIN = "top_margin"; public static final String BOTTOM_MARGIN = "bottom_margin"; public static final String LEFT_MARGIN = "left_margin"; diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/Utils.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/Utils.java index 57c56f552..1f5d749f0 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/Utils.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/utils/Utils.java @@ -56,10 +56,13 @@ import org.json.JSONObject; import org.yaml.snakeyaml.Yaml; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.URLDecoder; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -75,6 +78,7 @@ import java.util.Scanner; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.zip.GZIPInputStream; import timber.log.Timber; @@ -1041,6 +1045,29 @@ public static String extractValueFromJson(String value) return value; } + public static String decompress(String str, String outEncoding) { + if (str == null || str.length() == 0) { + return str; + } + + try { + String decode = URLDecoder.decode(str, "UTF-8"); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream in = new ByteArrayInputStream(decode.getBytes("ISO-8859-1")); + GZIPInputStream gunzip = new GZIPInputStream(in); + byte[] buffer = new byte[256]; + int n; + while ((n = gunzip.read(buffer)) >= 0) { + out.write(buffer, 0, n); + } + return out.toString(outEncoding); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + } diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/ReferenceFieldValidator.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/ReferenceFieldValidator.java new file mode 100644 index 000000000..b5db28f4b --- /dev/null +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/validators/edittext/ReferenceFieldValidator.java @@ -0,0 +1,25 @@ +package com.vijay.jsonwizard.validators.edittext; + +import androidx.annotation.NonNull; + +import com.rengwuxian.materialedittext.MaterialEditText; +import com.rengwuxian.materialedittext.validation.METValidator; + +import org.jetbrains.annotations.NotNull; + +public class ReferenceFieldValidator extends METValidator { + MaterialEditText referenceField; + public ReferenceFieldValidator(@NonNull @NotNull String errorMessage,MaterialEditText referenceField) { + super(errorMessage); + this.referenceField = referenceField; + } + + @Override + public boolean isValid(@NonNull @NotNull CharSequence charSequence, boolean isEmpty) { + if(!isEmpty) { + String referenceText = referenceField.getText().toString(); + return referenceText.equals(charSequence.toString()); + } + return true; + } +} diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java index 6a05a3bbb..45ff0b47b 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/EditTextFactory.java @@ -1,24 +1,12 @@ package com.vijay.jsonwizard.widgets; -import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_CUMULATIVE_VALIDATION_ERR; -import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_RELATIVE_MAX_VALIDATION_ERR; -import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_RELATIVE_MIN_VALIDATION_ERR; -import static com.vijay.jsonwizard.constants.JsonFormConstants.KEY; -import static com.vijay.jsonwizard.constants.JsonFormConstants.RELATED_FIELDS; -import static com.vijay.jsonwizard.constants.JsonFormConstants.RELATIVE_VALIDATION_EXCEPTION; -import static com.vijay.jsonwizard.constants.JsonFormConstants.STEP1; -import static com.vijay.jsonwizard.constants.JsonFormConstants.V_CUMULATIVE_TOTAL; -import static com.vijay.jsonwizard.constants.JsonFormConstants.V_RELATIVE_MAX; -import static com.vijay.jsonwizard.constants.JsonFormConstants.V_RELATIVE_MIN; -import static com.vijay.jsonwizard.utils.FormUtils.fields; -import static com.vijay.jsonwizard.utils.FormUtils.getFieldJSONObject; - import android.content.Context; import android.text.Editable; import android.text.InputFilter; import android.text.InputType; import android.text.TextUtils; import android.text.TextWatcher; +import android.text.method.PasswordTransformationMethod; import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; @@ -43,6 +31,7 @@ import com.vijay.jsonwizard.validators.edittext.MaxNumericValidator; import com.vijay.jsonwizard.validators.edittext.MinLengthValidator; import com.vijay.jsonwizard.validators.edittext.MinNumericValidator; +import com.vijay.jsonwizard.validators.edittext.ReferenceFieldValidator; import com.vijay.jsonwizard.validators.edittext.ReferenceValidator; import com.vijay.jsonwizard.validators.edittext.RelativeNumericValidator; import com.vijay.jsonwizard.validators.edittext.RequiredValidator; @@ -60,6 +49,19 @@ import timber.log.Timber; +import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_CUMULATIVE_VALIDATION_ERR; +import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_RELATIVE_MAX_VALIDATION_ERR; +import static com.vijay.jsonwizard.constants.JsonFormConstants.DEFAULT_RELATIVE_MIN_VALIDATION_ERR; +import static com.vijay.jsonwizard.constants.JsonFormConstants.KEY; +import static com.vijay.jsonwizard.constants.JsonFormConstants.RELATED_FIELDS; +import static com.vijay.jsonwizard.constants.JsonFormConstants.RELATIVE_VALIDATION_EXCEPTION; +import static com.vijay.jsonwizard.constants.JsonFormConstants.STEP1; +import static com.vijay.jsonwizard.constants.JsonFormConstants.V_CUMULATIVE_TOTAL; +import static com.vijay.jsonwizard.constants.JsonFormConstants.V_RELATIVE_MAX; +import static com.vijay.jsonwizard.constants.JsonFormConstants.V_RELATIVE_MIN; +import static com.vijay.jsonwizard.utils.FormUtils.fields; +import static com.vijay.jsonwizard.utils.FormUtils.getFieldJSONObject; + public class EditTextFactory implements FormWidgetFactory { public static final int MIN_LENGTH = 0; @@ -117,7 +119,6 @@ protected List attachJson(String stepName, Context context, JsonFormFragme RelativeLayout editTextLayout = rootLayout.findViewById(R.id.edit_text_layout); MaterialEditText editText = editTextLayout.findViewById(R.id.edit_text); ImageView editButton = editTextLayout.findViewById(R.id.material_edit_text_edit_button); - FormUtils.setEditButtonAttributes(jsonObject, editText, editButton, listener); attachLayout(stepName, context, formFragment, jsonObject, editText, editButton); @@ -179,6 +180,7 @@ public void run() { FormUtils.toggleEditTextVisibility(jsonObject, editText); addRequiredValidator(jsonObject, editText); + addEqualsValidator(formFragment,jsonObject,editText); addLengthValidator(jsonObject, editText); addRegexValidator(jsonObject, editText); addEmailValidator(jsonObject, editText); @@ -190,15 +192,19 @@ public void run() { addCumulativeTotalValidator(jsonObject, formFragment, editText, stepName, (JsonApi) context); // edit type check String editType = jsonObject.optString(JsonFormConstants.EDIT_TYPE); + editText.setSingleLine(false); if (!TextUtils.isEmpty(editType)) { if (JsonFormConstants.NUMBER.equals(editType)) { editText.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); } else if (JsonFormConstants.NAME.equals(editType)) { editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); } - } + else if (JsonFormConstants.PASSWORD.equals(editType)) + { + editText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + } - editText.setSingleLine(false); + } editText.addTextChangedListener(new GenericTextWatcher(stepName, formFragment, editText)); attachRefreshLogic(context, jsonObject, editText); } @@ -212,6 +218,15 @@ private void attachInfoIcon(String stepName, JSONObject jsonObject, RelativeLayo } + private void addEqualsValidator(JsonFormFragment formFragment,JSONObject jsonObject, MaterialEditText editText) throws JSONException { + JSONObject requiredObject = jsonObject.optJSONObject(JsonFormConstants.V_EQUALS); + if (requiredObject != null) { + String referencedValue = requiredObject.optString(JsonFormConstants.VALUE,""); + MaterialEditText referencedEditText = (MaterialEditText) formFragment.getJsonApi().getFormDataView(referencedValue); + editText.addValidator(new ReferenceFieldValidator(requiredObject.getString(JsonFormConstants.ERR),referencedEditText)); + FormUtils.setRequiredOnHint(editText); + } + } private void addRequiredValidator(JSONObject jsonObject, MaterialEditText editText) throws JSONException { JSONObject requiredObject = jsonObject.optJSONObject(JsonFormConstants.V_REQUIRED); if (requiredObject != null) { diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/NativeEditTextFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/NativeEditTextFactory.java index 169f5431e..2c0f2fd2a 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/NativeEditTextFactory.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/NativeEditTextFactory.java @@ -4,6 +4,7 @@ import android.os.Build; import android.text.InputType; import android.text.TextUtils; +import android.text.method.PasswordTransformationMethod; import android.util.Patterns; import android.view.LayoutInflater; import android.view.View; @@ -144,6 +145,10 @@ protected void makeFromJson(String stepName, Context context, JsonFormFragment f } else if ("name".equals(editType)) { editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_CAP_WORDS); } + else if ("password".equals(editType)) + { + editText.setTransformationMethod(PasswordTransformationMethod.getInstance()); + } } editText.addTextChangedListener(new GenericTextWatcher(stepName, formFragment, editText)); diff --git a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/OptiBPWidgetFactory.java b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/OptiBPWidgetFactory.java index 619e85e09..44e96c1d4 100644 --- a/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/OptiBPWidgetFactory.java +++ b/android-json-form-wizard/src/main/java/com/vijay/jsonwizard/widgets/OptiBPWidgetFactory.java @@ -146,6 +146,7 @@ private Button initLaunchButton(LinearLayout rootLayout, final WidgetArgs widget Timber.w(" ONCLICK WITH JSON %s", jsonObject); Intent intent = new Intent(OptibpConstants.OPTIBP_LAUNCH_INTENT); intent.setType("text/json"); + Timber.e("OptibpWidget factory sending request %s", getInputJsonString(context, jsonObject, widgetArgs)); intent.putExtra(Intent.EXTRA_TEXT, getInputJsonString(context, jsonObject, widgetArgs)); ((Activity) context).startActivityForResult(Intent.createChooser(intent, ""), requestCode); } catch (Exception e) { @@ -182,9 +183,14 @@ private void formatButtonWidget(Button button, JSONObject jsonObject) throws JSO public void setUpOptiBpActivityResultListener(final WidgetArgs widgetArgs, int requestCode, final LinearLayout rootLayout, EditText systolicEditText, final EditText diastolicEditText) { final Context context = widgetArgs.getContext(); + if (context instanceof JsonApi) { final JsonApi jsonApi = (JsonApi) context; jsonApi.addOnActivityResultListener(requestCode, (finalRequestCode, resultCode, data) -> { + Timber.e("OptibpWidgetFactory optib requestCode %s resultCode %s", requestCode, resultCode); + if(data != null) + Timber.e("OptibpWidgetFactory data %s",data.getStringExtra(Intent.EXTRA_TEXT)); + else Timber.e("OptibpWidgetFactory data is null"); if (resultCode == Activity.RESULT_OK) { if (finalRequestCode == OptibpConstants.OPTIBP_REQUEST_CODE || finalRequestCode == OptibpConstants.OPTIBP_REPEAT_REQUEST_CODE) { @@ -333,7 +339,7 @@ protected String getInputJsonString(Context context, JSONObject jsonObject, Widg * Adding new calibration data here */ appendHealthData(optiBPData, widgetArgs); - optiBPData.put(OptibpConstants.CALIBRATION, getCalibrationData(optiBPData.optString(OptibpConstants.CALIBRATION))); + optiBPData.put(OptibpConstants.CALIBRATION, getCalibrationData(Utils.decompress(optiBPData.optString(OptibpConstants.CALIBRATION),"UTF-8"))); return optiBPData.toString(); } diff --git a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/activities/JsonFormActivityTest.java b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/activities/JsonFormActivityTest.java index 43bebf226..5ee03b393 100644 --- a/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/activities/JsonFormActivityTest.java +++ b/android-json-form-wizard/src/test/java/com/vijay/jsonwizard/activities/JsonFormActivityTest.java @@ -618,4 +618,9 @@ public void testGetViewKey() throws Exception { assertEquals(key + ":" + childKey, returnKey); } -} + + @Test + public void testGetCOuntSHouldReturnTheCorrectCount() { + assertEquals("1", activity.getCount()); + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index be834e97e..3426598f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -VERSION_NAME=3.1.2-SNAPSHOT +VERSION_NAME=3.1.7-DEV-SNAPSHOT VERSION_CODE=1 GROUP=org.smartregister POM_SETTING_DESCRIPTION=OpenSRP Client Native Form Json Wizard