Skip to content

Commit

Permalink
Merge pull request #430 from OpenSRP/feature/testing_tuesday
Browse files Browse the repository at this point in the history
Testing tuesday
  • Loading branch information
dubdabasoduba committed Jun 16, 2020
2 parents ec23834 + dfc1ae1 commit e284009
Show file tree
Hide file tree
Showing 6 changed files with 305 additions and 116 deletions.
2 changes: 1 addition & 1 deletion android-json-form-wizard/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ buildscript {
dependencies {
classpath('com.android.tools.build:gradle:3.5.3') {
transitive = true
exclude group: 'org.apache.httpcomponents', module: 'httpmime'
exclude group: 'org.apache.httpcomponents', module: 'httpmime'
}
classpath 'org.apache.commons:commons-lang3:3.7'
classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.8.3'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import android.net.Uri;
import android.os.CountDownTimer;
import android.provider.Settings;
import android.text.TextUtils;
import android.support.annotation.VisibleForTesting;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
Expand All @@ -23,6 +23,7 @@
import com.vijay.jsonwizard.interfaces.JsonApi;
import com.vijay.jsonwizard.utils.FormUtils;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
Expand Down Expand Up @@ -64,7 +65,7 @@ public List<View> getViewsFromJson(String stepName, Context context, JsonFormFra
.withContext(context)
.withPopup(popup);

rootLayout = LayoutInflater.from(context).inflate(getLayout(), null);
rootLayout = getRootView(context);
initializeViewConfigs(jsonObject);
setWidgetTags(jsonObject, stepName);
formatWidget(jsonObject, context);
Expand All @@ -79,6 +80,11 @@ public List<View> getViewsFromJson(String stepName, Context context, JsonFormFra
return views;
}

@VisibleForTesting
protected View getRootView(Context context) {
return LayoutInflater.from(context).inflate(getLayout(), null);
}

@Override
public List<View> getViewsFromJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject, CommonListener listener) throws Exception {
return getViewsFromJson(stepName, context, formFragment, jsonObject, listener, false);
Expand Down Expand Up @@ -147,17 +153,17 @@ private void initSpecialViewsRefs(Context context, JSONObject jsonObject, Circle
String constraints = jsonObject.optString(JsonFormConstants.CONSTRAINTS);
String calculation = jsonObject.optString(JsonFormConstants.CALCULATION);

if (!TextUtils.isEmpty(relevance) && context instanceof JsonApi) {
if (StringUtils.isNotBlank(relevance) && context instanceof JsonApi) {
circleProgressBar.setTag(R.id.relevance, relevance);
((JsonApi) context).addSkipLogicView(circleProgressBar);
}

if (!TextUtils.isEmpty(constraints) && context instanceof JsonApi) {
if (StringUtils.isNotBlank(constraints) && context instanceof JsonApi) {
circleProgressBar.setTag(R.id.constraints, constraints);
((JsonApi) context).addConstrainedView(circleProgressBar);
}

if (!TextUtils.isEmpty(calculation) && context instanceof JsonApi) {
if (StringUtils.isNotBlank(calculation) && context instanceof JsonApi) {
circleProgressBar.setTag(R.id.calculation, calculation);
((JsonApi) context).addCalculationLogicView(circleProgressBar);
}
Expand Down Expand Up @@ -212,7 +218,9 @@ public void onFinish() {

public void ringAlarm(Context context) {
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
alarmTone = (alert == null) ? RingtoneManager.getRingtone(context, Settings.System.DEFAULT_RINGTONE_URI) : RingtoneManager.getRingtone(context, alert);
if (alert == null)
alarmTone = RingtoneManager.getRingtone(context, Settings.System.DEFAULT_RINGTONE_URI);
else alarmTone = RingtoneManager.getRingtone(context, alert);
if (!alarmTone.isPlaying()) {
alarmTone.play();
}
Expand All @@ -227,6 +235,7 @@ private String getFormattedTimeText(long timeValue) {
/**
* Override this to provide more on countdown complete post processing
*/
@VisibleForTesting
protected void onCountdownFinish(Context context) {
// Countdown complete post processing
ringAlarm(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import android.app.FragmentTransaction;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.support.annotation.VisibleForTesting;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
Expand All @@ -25,6 +25,7 @@
import com.vijay.jsonwizard.utils.FormUtils;
import com.vijay.jsonwizard.validators.edittext.RequiredValidator;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
Expand All @@ -37,6 +38,8 @@
import java.util.Locale;
import java.util.Set;

import timber.log.Timber;

import static com.vijay.jsonwizard.widgets.TimePickerFactory.KEY.DURATION;

public class TimePickerFactory implements FormWidgetFactory {
Expand All @@ -54,36 +57,38 @@ public List<View> getViewsFromJson(String stepName, Context context, JsonFormFra
return attachJson(stepName, context, formFragment, jsonObject, false);
}

@Override
@NonNull
public Set<String> getCustomTranslatableWidgetFields() {
Set<String> customTranslatableWidgetFields = new HashSet<>();
customTranslatableWidgetFields.add(DURATION + "." + JsonFormConstants.LABEL);
return customTranslatableWidgetFields;
}

private List<View> attachJson(String stepName, Context context, JsonFormFragment formFragment, JSONObject jsonObject,
boolean popup) {
List<View> views = new ArrayList<>(1);
try {

RelativeLayout dateViewRelativeLayout = (RelativeLayout) LayoutInflater
.from(context).inflate(getLayout(), null);

MaterialEditText editText = dateViewRelativeLayout.findViewById(R.id.edit_text);

TextView duration = dateViewRelativeLayout.findViewById(R.id.duration);

attachLayout(stepName, context, formFragment, jsonObject, editText, duration);

JSONArray canvasIds = new JSONArray();
dateViewRelativeLayout.setId(ViewUtil.generateViewId());
canvasIds.put(dateViewRelativeLayout.getId());
editText.setTag(R.id.canvas_ids, canvasIds.toString());
editText.setTag(R.id.extraPopup, popup);

((JsonApi) context).addFormDataView(editText);
views.add(dateViewRelativeLayout);

} catch (Exception e) {
e.printStackTrace();
}
RelativeLayout dateViewRelativeLayout = getRelativeLayout(context);
MaterialEditText editText = dateViewRelativeLayout.findViewById(R.id.edit_text);
TextView duration = dateViewRelativeLayout.findViewById(R.id.duration);
attachLayout(stepName, context, formFragment, jsonObject, editText, duration);
JSONArray canvasIds = new JSONArray();
dateViewRelativeLayout.setId(ViewUtil.generateViewId());
canvasIds.put(dateViewRelativeLayout.getId());
editText.setTag(R.id.canvas_ids, canvasIds.toString());
editText.setTag(R.id.extraPopup, popup);

((JsonApi) context).addFormDataView(editText);
views.add(dateViewRelativeLayout);

return views;
}

@VisibleForTesting
protected RelativeLayout getRelativeLayout(Context context) {
return (RelativeLayout) LayoutInflater.from(context).inflate(getLayout(), null);
}

protected void attachLayout(String stepName, final Context context, JsonFormFragment formFragment, JSONObject jsonObject,
final MaterialEditText editText, final TextView duration) {

Expand Down Expand Up @@ -132,78 +137,21 @@ public boolean onLongClick(View v) {
editText.addTextChangedListener(genericTextWatcher);
addRefreshLogicView(context, editText, relevance, constraints, calculations);
editText.setFocusable(false);
} catch (Exception e) {
e.printStackTrace();
}

}

private void addRefreshLogicView(Context context, MaterialEditText editText, String relevance, String constraints,
String calculations) {
if (!TextUtils.isEmpty(relevance) && context instanceof JsonApi) {
editText.setTag(R.id.relevance, relevance);
((JsonApi) context).addSkipLogicView(editText);
}

if (!TextUtils.isEmpty(constraints) && context instanceof JsonApi) {
editText.setTag(R.id.constraints, constraints);
((JsonApi) context).addConstrainedView(editText);
}

if (!TextUtils.isEmpty(calculations) && context instanceof JsonApi) {
editText.setTag(R.id.calculation, calculations);
((JsonApi) context).addCalculationLogicView(editText);
} catch (JSONException e) {
Timber.e(e);
} catch (ParseException e) {
Timber.e(e);
}
}

@NonNull
private GenericTextWatcher getGenericTextWatcher(String stepName, final Activity context, JsonFormFragment formFragment,
final MaterialEditText editText,
final TimePickerDialog timePickerDialog) {
GenericTextWatcher genericTextWatcher = new GenericTextWatcher(stepName, formFragment, editText);
genericTextWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showTimePickerDialog(context, timePickerDialog);
}
}
});
return genericTextWatcher;
}

private static void showTimePickerDialog(Activity context,
TimePickerDialog timePickerDialog
) {
FragmentTransaction ft = context.getFragmentManager().beginTransaction();
Fragment prev = context.getFragmentManager().findFragmentByTag(TAG);
if (prev != null) {
ft.remove(prev);
}

ft.addToBackStack(null);

timePickerDialog.show(ft, TAG);

}

private TimePickerDialog createTimeDialog(Context context, final MaterialEditText editText) {
final TimePickerDialog mTimePicker = new TimePickerDialog();
mTimePicker.setContext(context);
mTimePicker.setOnTimeSetListener(new android.app.TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
editText.setTag(R.id.locale_independent_value, String.format(Locale.ENGLISH, "%02d", hourOfDay) + ":" + String.format(Locale.ENGLISH, "%02d", minute));
updateTimeText(editText, hourOfDay, minute);
}
});
return mTimePicker;
protected int getLayout() {
return R.layout.native_form_item_time_picker;
}

private void updateEditText(MaterialEditText editText, JSONObject jsonObject, String stepName, Context context
) throws JSONException, ParseException {

Locale locale = context.getResources().getConfiguration().locale.getLanguage().equals("ar") ? Locale.ENGLISH : context.getResources().getConfiguration().locale;//Arabic should render normal numbers/numeric digits
Locale locale = getCurrentLocale(context);
SimpleDateFormat TIME_FORMAT_LOCALE = new SimpleDateFormat("hh:mm", locale);

String openMrsEntityParent = jsonObject.getString(JsonFormConstants.OPENMRS_ENTITY_PARENT);
Expand All @@ -228,7 +176,7 @@ private void updateEditText(MaterialEditText editText, JSONObject jsonObject, St
}
}

if (!TextUtils.isEmpty(jsonObject.optString(TimePickerFactory.KEY.VALUE))) {
if (StringUtils.isNotBlank(jsonObject.optString(TimePickerFactory.KEY.VALUE))) {
updateTimeText(editText, TIME_FORMAT_LOCALE.format(TIME_FORMAT.parse(jsonObject.optString(TimePickerFactory.KEY.VALUE))));
} else if (jsonObject.has(TimePickerFactory.KEY.DEFAULT)) {
updateTimeText(editText, TIME_FORMAT_LOCALE.format(TIME_FORMAT.parse(jsonObject.optString(TimePickerFactory.KEY.VALUE))));
Expand All @@ -241,39 +189,86 @@ private void updateEditText(MaterialEditText editText, JSONObject jsonObject, St
}
}

private void updateTimeText(MaterialEditText editText, String durationText) {
private TimePickerDialog createTimeDialog(Context context, final MaterialEditText editText) {
final TimePickerDialog mTimePicker = new TimePickerDialog();
mTimePicker.setContext(context);
mTimePicker.setOnTimeSetListener(new android.app.TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
editText.setTag(R.id.locale_independent_value, String.format(Locale.ENGLISH, "%02d", hourOfDay) + ":" + String.format(Locale.ENGLISH, "%02d", minute));
updateTimeText(editText, hourOfDay, minute);
}
});
return mTimePicker;
}

editText.setText(durationText);
private static void showTimePickerDialog(Activity context,
TimePickerDialog timePickerDialog
) {
FragmentTransaction ft = context.getFragmentManager().beginTransaction();
Fragment prev = context.getFragmentManager().findFragmentByTag(TAG);
if (prev != null) {
ft.remove(prev);
}

ft.addToBackStack(null);
timePickerDialog.show(ft, TAG);

}

private void updateTimeText(MaterialEditText editText, int selectedHour, int selectedMinute) {
String durationText = String.format("%02d:%02d", selectedHour, selectedMinute);
private void updateTimeText(MaterialEditText editText, String durationText) {
editText.setText(durationText);
}

@NonNull
private GenericTextWatcher getGenericTextWatcher(String stepName, final Activity context, JsonFormFragment formFragment,
final MaterialEditText editText,
final TimePickerDialog timePickerDialog) {
GenericTextWatcher genericTextWatcher = new GenericTextWatcher(stepName, formFragment, editText);
genericTextWatcher.addOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
showTimePickerDialog(context, timePickerDialog);
}
}
});
return genericTextWatcher;
}

private void addRefreshLogicView(Context context, MaterialEditText editText, String relevance, String constraints,
String calculations) {
if (StringUtils.isNotBlank(relevance) && context instanceof JsonApi) {
editText.setTag(R.id.relevance, relevance);
((JsonApi) context).addSkipLogicView(editText);
}

if (StringUtils.isNotBlank(constraints) && context instanceof JsonApi) {
editText.setTag(R.id.constraints, constraints);
((JsonApi) context).addConstrainedView(editText);
}

if (StringUtils.isNotBlank(calculations) && context instanceof JsonApi) {
editText.setTag(R.id.calculation, calculations);
((JsonApi) context).addCalculationLogicView(editText);
}
}

protected int getLayout() {
return R.layout.native_form_item_time_picker;
@VisibleForTesting
protected Locale getCurrentLocale(Context context) {
return context.getResources().getConfiguration().locale.getLanguage().equals("ar") ? Locale.ENGLISH : context.getResources().getConfiguration().locale;
}

private void updateTimeText(MaterialEditText editText, int selectedHour, int selectedMinute) {
String durationText = String.format("%02d:%02d", selectedHour, selectedMinute);
editText.setText(durationText);
}

public static class KEY {
public static final String DURATION = "duration";

public static final String HINT = "hint";

public static final String KEY = "key";

public static final String VALUE = (JsonFormConstants.VALUE);

public static final String DEFAULT = "default";
}

@Override
@NonNull
public Set<String> getCustomTranslatableWidgetFields() {
Set<String> customTranslatableWidgetFields = new HashSet<>();
customTranslatableWidgetFields.add(DURATION + "." + JsonFormConstants.LABEL);
return customTranslatableWidgetFields;
}
}
Loading

0 comments on commit e284009

Please sign in to comment.