diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java index 381446c7a..26cc9154b 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodActivity.java @@ -30,6 +30,7 @@ import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.HyperwalletError; +import com.hyperwallet.android.ui.view.WidgetDateDialogFragment; import com.hyperwallet.android.ui.view.WidgetSelectionDialogFragment; import com.hyperwallet.android.ui.view.error.DefaultErrorDialogFragment; import com.hyperwallet.android.ui.view.error.OnNetworkErrorCallback; @@ -40,7 +41,7 @@ public class AddTransferMethodActivity extends AppCompatActivity implements WidgetSelectionDialogFragment.WidgetSelectionItemListener, AddTransferMethodFragment.OnAddTransferMethodNetworkErrorCallback, AddTransferMethodFragment.OnLoadTransferMethodConfigurationFieldsNetworkErrorCallback, - OnNetworkErrorCallback { + OnNetworkErrorCallback, WidgetDateDialogFragment.OnSelectedDateCallback { public static final String EXTRA_TRANSFER_METHOD_COUNTRY = "TRANSFER_METHOD_COUNTRY"; public static final String EXTRA_TRANSFER_METHOD_CURRENCY = "TRANSFER_METHOD_CURRENCY"; @@ -190,4 +191,14 @@ private AddTransferMethodFragment getAddTransferMethodFragment() { } return fragment; } + + @Override + public void setSelectedDateField(@NonNull String fieldName, final String selectedValue) { + FragmentManager fragmentManager = getSupportFragmentManager(); + AddTransferMethodFragment addTransferMethodFragment = + (AddTransferMethodFragment) fragmentManager.findFragmentById(R.id.add_transfer_method_fragment); + if (addTransferMethodFragment != null) { + addTransferMethodFragment.onDateSelected(selectedValue, fieldName); + } + } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java index 659e6a205..b2caba7fe 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/transfermethod/AddTransferMethodFragment.java @@ -56,8 +56,12 @@ import com.hyperwallet.android.model.meta.field.HyperwalletFieldGroup; import com.hyperwallet.android.ui.HyperwalletLocalBroadcast; import com.hyperwallet.android.ui.repository.RepositoryFactory; +import com.hyperwallet.android.ui.view.WidgetDateDialogFragment; import com.hyperwallet.android.ui.view.WidgetSelectionDialogFragment; import com.hyperwallet.android.ui.view.widget.AbstractWidget; +import com.hyperwallet.android.ui.view.widget.DateChangedListener; +import com.hyperwallet.android.ui.view.widget.DateUtil; +import com.hyperwallet.android.ui.view.widget.DateWidget; import com.hyperwallet.android.ui.view.widget.WidgetEventListener; import com.hyperwallet.android.ui.view.widget.WidgetFactory; import com.hyperwallet.android.ui.view.widget.WidgetInputState; @@ -94,6 +98,7 @@ public class AddTransferMethodFragment extends Fragment implements WidgetEventLi private HyperwalletTransferMethod mTransferMethod; private String mTransferMethodProfileType; private HashMap mWidgetInputStateHashMap; + private final DateUtil mDateUtil = new DateUtil(); /** * Please do not use this to have instance of AddTransferMethodFragment this is reserved for android framework @@ -580,4 +585,33 @@ private boolean performValidation(boolean bypassFocusCheck) { public boolean isActive() { return isAdded(); } + + @Override + public void openWidgetDateDialog(@Nullable final String date, @NonNull final String fieldName) { + if (getFragmentManager() != null) { + WidgetDateDialogFragment dateDialogFragment = (WidgetDateDialogFragment) + getFragmentManager().findFragmentByTag(WidgetDateDialogFragment.TAG); + + if (dateDialogFragment == null) { + dateDialogFragment = WidgetDateDialogFragment.newInstance(date, fieldName); + } + + if (!dateDialogFragment.isAdded()) { + dateDialogFragment.show(getFragmentManager()); + } + } + } + + void onDateSelected(@NonNull final String selectedValue, @NonNull final String fieldName) { + for (int i = 0; i < mDynamicContainer.getChildCount(); i++) { + View view = mDynamicContainer.getChildAt(i); + if (view.getTag() instanceof DateWidget) { + AbstractWidget widget = (AbstractWidget) view.getTag(); + if (fieldName.equals(widget.getName()) && widget instanceof DateChangedListener) { + ((DateChangedListener) view.getTag()).onUpdate(selectedValue); + return; + } + } + } + } } diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetDateDialogFragment.java b/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetDateDialogFragment.java new file mode 100644 index 000000000..0fd6910ff --- /dev/null +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/WidgetDateDialogFragment.java @@ -0,0 +1,113 @@ +package com.hyperwallet.android.ui.view; + +import android.app.DatePickerDialog; +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.widget.DatePicker; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentManager; + +import com.hyperwallet.android.hyperwallet_ui.R; +import com.hyperwallet.android.ui.view.widget.DateUtil; + +import java.util.Calendar; + +public class WidgetDateDialogFragment extends DialogFragment { + + public static final String TAG = WidgetDateDialogFragment.class.getName(); + private static final String ARGUMENT_DATE = "ARGUMENT_DATE"; + private static final String ARGUMENT_FIELD_NAME = "ARGUMENT_FIELD_NAME"; + private OnSelectedDateCallback mOnSelectedDateCallback; + private final DateUtil mDateUtil = new DateUtil(); + + /** + * Please do not use this to have instance of DateDialogFragment this is reserved for android framework + */ + public WidgetDateDialogFragment() { + setRetainInstance(true); + } + + public static WidgetDateDialogFragment newInstance(final String date, @NonNull final String fieldName) { + WidgetDateDialogFragment widgetDateDialogFragment = new WidgetDateDialogFragment(); + Bundle bundle = new Bundle(); + bundle.putString(ARGUMENT_DATE, date); + bundle.putString(ARGUMENT_FIELD_NAME, fieldName); + widgetDateDialogFragment.setArguments(bundle); + + return widgetDateDialogFragment; + } + + @Override + public void onAttach(Context context) { + super.onAttach(context); + try { + mOnSelectedDateCallback = (OnSelectedDateCallback) context; + } catch (ClassCastException e) { + throw new ClassCastException(getActivity().toString() + + " must implement " + + OnSelectedDateCallback.class.getCanonicalName()); + } + } + + public void show(@NonNull FragmentManager manager) { + show(manager, TAG); + } + + @Override + public void onDestroyView() { + Dialog dialog = getDialog(); + if (dialog != null && getRetainInstance()) { + dialog.setDismissMessage(null); + } + super.onDestroyView(); + } + + @NonNull + @Override + public Dialog onCreateDialog(@Nullable Bundle state) { + + String storedDate = getArguments() != null ? getArguments().getString(ARGUMENT_DATE) : ""; + final String fieldName = getArguments().getString(ARGUMENT_FIELD_NAME); + Calendar calendar; + try { + calendar = mDateUtil.convertDateFromServerFormatToCalendar(storedDate); + } catch (Exception e) { + calendar = Calendar.getInstance(); + } + + DatePickerDialog datePickerDialog = new DatePickerDialog(requireContext(), + R.style.Widget_Hyperwallet_DatePicker, + new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int resultYear, int resultMonth, int resultDayOfMonth) { + final String selectedDate = mDateUtil + .buildDateFromDateDialogToServerFormat(resultYear, resultMonth, resultDayOfMonth); + mOnSelectedDateCallback.setSelectedDateField(fieldName, selectedDate); + } + }, + calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); + + datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, + getString(R.string.cancel_button_label), + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + if (which == DialogInterface.BUTTON_NEGATIVE) { + mOnSelectedDateCallback.setSelectedDateField(fieldName, null); + } + } + }); + + datePickerDialog.setCanceledOnTouchOutside(false); + return datePickerDialog; + } + + public interface OnSelectedDateCallback { + void setSelectedDateField(@NonNull final String fieldName, final String selectedValue); + } +} diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateChangedListener.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateChangedListener.java new file mode 100644 index 000000000..1d85dbe33 --- /dev/null +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateChangedListener.java @@ -0,0 +1,23 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2018 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.hyperwallet.android.ui.view.widget; + +import androidx.annotation.Nullable; + +public interface DateChangedListener { + void onUpdate(@Nullable final String selectedDate); +} diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateUtil.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateUtil.java new file mode 100644 index 000000000..8da501d0b --- /dev/null +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateUtil.java @@ -0,0 +1,94 @@ +/* + * The MIT License (MIT) + * Copyright (c) 2018 Hyperwallet Systems Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package com.hyperwallet.android.ui.view.widget; + +import android.text.TextUtils; +import android.text.format.DateFormat; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Locale; + +/** + * Class is used for manage and convert date {@link DateWidget} + */ +public final class DateUtil { + + private static final String SERVER_DATE_PATTERN = "yyyy-MM-dd"; + private static final String WIDGET_DATE_PATTERN = "dd MMMM yyyy"; + + private final SimpleDateFormat mServerDateFormat = new SimpleDateFormat(SERVER_DATE_PATTERN, Locale.getDefault()); + private final SimpleDateFormat mWidgetDateFormat; + + public DateUtil() { + mWidgetDateFormat = new SimpleDateFormat( + DateFormat.getBestDateTimePattern(Locale.getDefault(), WIDGET_DATE_PATTERN), Locale.getDefault()); + } + + /** + * Convert Date from server format (yyyy-MM-dd) to DateWidget format build by BestDateTimePattern @see {@link + * DateFormat} or (dd MMMM yyyy) + * + * @param serverDate Date from server + * @return String date in the format by BestDateTimePattern or dd MMMM yyyy otherwise + */ + @NonNull + String convertDateFromServerToWidgetFormat(@Nullable final String serverDate) throws ParseException { + if (!TextUtils.isEmpty(serverDate)) { + final Calendar calendar = Calendar.getInstance(); + calendar.setTime(mServerDateFormat.parse(serverDate)); + return mWidgetDateFormat.format(calendar.getTime()); + } + return ""; + } + + /** + * Build Date in the server format (yyyy-MM-dd) + * + * @param year the selected year + * @param month the selected month (0-11 for compatibility with {@link Calendar#MONTH}) + * @param dayOfMonth th selected day of the month (1-31, depending on month) + * @return String date in the format (yyyy-MM-dd) + */ + @NonNull + public String buildDateFromDateDialogToServerFormat(final int year, final int month, final int dayOfMonth) { + final Calendar calendar = Calendar.getInstance(); + calendar.set(year, month, dayOfMonth); + return mServerDateFormat.format(calendar.getTime()); + } + + /** + * Convert Date from server format (yyyy-MM-dd) to Calendar + * + * @param serverDate Date from server + * @return Calendar with date from server + */ + @NonNull + public Calendar convertDateFromServerFormatToCalendar(@Nullable final String serverDate) throws ParseException { + final Calendar calendar = Calendar.getInstance(); + if (!TextUtils.isEmpty(serverDate)) { + calendar.setTime(mServerDateFormat.parse(serverDate)); + } + return calendar; + } + +} \ No newline at end of file diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java index 00746d090..2a64a38d3 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/DateWidget.java @@ -16,15 +16,14 @@ */ package com.hyperwallet.android.ui.view.widget; -import android.text.Editable; -import android.text.InputType; +import android.app.Activity; import android.text.TextUtils; -import android.text.TextWatcher; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import androidx.annotation.NonNull; @@ -34,15 +33,20 @@ import com.hyperwallet.android.hyperwallet_ui.R; import com.hyperwallet.android.model.meta.field.HyperwalletField; -public class DateWidget extends AbstractWidget { +import java.text.ParseException; +public class DateWidget extends AbstractWidget implements DateChangedListener { + + private final DateUtil mDateUtil; private ViewGroup mContainer; private String mValue; private TextInputLayout mTextInputLayout; + private EditText mEditText; public DateWidget(@NonNull HyperwalletField field, @NonNull WidgetEventListener listener, @Nullable String defaultValue, @NonNull View defaultFocusView) { super(field, listener, defaultValue, defaultFocusView); + mDateUtil = new DateUtil(); mValue = defaultValue; } @@ -51,53 +55,44 @@ public View getView(@NonNull final ViewGroup viewGroup) { if (mContainer == null) { mContainer = (ViewGroup) LayoutInflater.from(viewGroup.getContext()) .inflate(R.layout.item_widget_layout, viewGroup, false); + setIdFromFieldLabel(mContainer); + mContainer.setFocusable(true); + mContainer.setFocusableInTouchMode(false); // input control mTextInputLayout = new TextInputLayout(new ContextThemeWrapper(viewGroup.getContext(), mField.isEditable() ? R.style.Widget_Hyperwallet_TextInputLayout : R.style.Widget_Hyperwallet_TextInputLayout_Disabled)); - final EditText editText = new EditText( - new ContextThemeWrapper(viewGroup.getContext(), R.style.Widget_Hyperwallet_TextInputEditText)); - editText.setEnabled(mField.isEditable()); - setIdFromFieldName(editText); + mEditText = new EditText( + new ContextThemeWrapper(viewGroup.getContext(), R.style.Widget_Hyperwallet_TextInputEditText)); + try { + mEditText.setText(mDateUtil.convertDateFromServerToWidgetFormat( + TextUtils.isEmpty(mDefaultValue) ? mValue = mField.getValue() : mDefaultValue)); + } catch (ParseException e) { + mEditText.setText(""); + } setIdFromFieldLabel(mTextInputLayout); + + mEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); + mEditText.setKeyListener(null); + mEditText.setFocusableInTouchMode(false); + mEditText.setFocusable(false); + setIdFromFieldName(mEditText); mTextInputLayout.setHint(mField.getLabel()); - mTextInputLayout.addView(editText); - - editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { - @Override - public void onFocusChange(View v, boolean hasFocus) { - if (!hasFocus) { - mValue = ((EditText) v).getText().toString(); - mListener.valueChanged(); - } else { - mListener.widgetFocused(DateWidget.this.getName()); - } - } - }); - editText.addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - if (before != count) { - mValue = s.toString(); - mListener.saveTextChanged(getName(), getValue()); - } - } + mTextInputLayout.addView(mEditText); - @Override - public void afterTextChanged(Editable s) { - } - }); + mEditText.setEnabled(mField.isEditable()); + if (mField.isEditable()) { + mEditText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + hideSoftKey(v); + mListener.openWidgetDateDialog(mValue, mField.getName()); + } + }); + } - editText.setText(TextUtils.isEmpty(mDefaultValue) ? mField.getValue() : mDefaultValue); - editText.setInputType(InputType.TYPE_CLASS_DATETIME); - editText.setOnKeyListener(new DefaultKeyListener(mDefaultFocusView, editText)); - editText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_ACTION_NEXT); appendLayout(mTextInputLayout, true); mContainer.addView(mTextInputLayout); } @@ -113,4 +108,28 @@ public String getValue() { public void showValidationError(String errorMessage) { mTextInputLayout.setError(errorMessage); } -} + + @Override + public void onUpdate(@Nullable final String selectedDate) { + if (!TextUtils.isEmpty(selectedDate)) { + mValue = selectedDate; + try { + mEditText.setText(mDateUtil.convertDateFromServerToWidgetFormat(selectedDate)); + mListener.saveTextChanged(getName(), getValue()); + mListener.valueChanged(); + } catch (ParseException e) { + mEditText.setText(selectedDate); + } + } + if (isValid()) { + mTextInputLayout.setError(null); + } + } + + private void hideSoftKey(@NonNull View focusedView) { + InputMethodManager inputMethodManager = (InputMethodManager) focusedView.getContext().getSystemService( + Activity.INPUT_METHOD_SERVICE); + inputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0); + } + +} \ No newline at end of file diff --git a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetEventListener.java b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetEventListener.java index 786ebaee8..75ebe7535 100644 --- a/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetEventListener.java +++ b/ui/src/main/java/com/hyperwallet/android/ui/view/widget/WidgetEventListener.java @@ -17,6 +17,7 @@ package com.hyperwallet.android.ui.view.widget; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import java.util.TreeMap; @@ -30,4 +31,6 @@ void openWidgetSelectionFragmentDialog(@NonNull final TreeMap na void widgetFocused(@NonNull final String fieldName); void saveTextChanged(@NonNull final String fieldName, @NonNull final String value); + + void openWidgetDateDialog(@Nullable final String date, @NonNull final String fieldName); } diff --git a/ui/src/main/res/values/styles.xml b/ui/src/main/res/values/styles.xml index 887a6de77..6d39a8667 100644 --- a/ui/src/main/res/values/styles.xml +++ b/ui/src/main/res/values/styles.xml @@ -224,4 +224,10 @@ @color/colorSecondaryDark normal + + diff --git a/ui/src/test/java/com/hyperwallet/android/ui/view/widget/DateUtilTest.java b/ui/src/test/java/com/hyperwallet/android/ui/view/widget/DateUtilTest.java new file mode 100644 index 000000000..d016de8af --- /dev/null +++ b/ui/src/test/java/com/hyperwallet/android/ui/view/widget/DateUtilTest.java @@ -0,0 +1,89 @@ +package com.hyperwallet.android.ui.view.widget; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.text.ParseException; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collection; + +@RunWith(RobolectricTestRunner.class) +public class DateUtilTest { + private final DateUtil mDateUtil = new DateUtil(); + + @Rule + public final ExpectedException mThrown = ExpectedException.none(); + + @Test + public void testConvertDateFromServerToWidgetFormat() throws Exception { + String serverDate = "2005-05-23"; + String widgetDate = "23 May 2005"; + assertThat(mDateUtil.convertDateFromServerToWidgetFormat(serverDate), is(widgetDate)); + } + + @Test + public void testBuildParamsDateFromServerToWidget_whenIncorrectDate() throws Exception { + mThrown.expect(ParseException.class); + mDateUtil.convertDateFromServerToWidgetFormat("1990-01"); + } + + @Test + public void testConvertDateFromServerToWidgetFormat_whenDateIsNullOrEmpty() throws Exception { + assertThat(mDateUtil.convertDateFromServerToWidgetFormat(""), is("")); + assertThat(mDateUtil.convertDateFromServerToWidgetFormat(null), is("")); + } + + @Test + public void testBuildParamsDateFromServerToCalendar_whenIncorrectDate() throws Exception { + mThrown.expect(ParseException.class); + mDateUtil.convertDateFromServerFormatToCalendar("123-32").getTime(); + } + + @Test + public void testConvertDateFromServerFormatToCalendar_whenDateIsNullOrEmpty() throws ParseException { + assertThat(mDateUtil.convertDateFromServerFormatToCalendar(null).getTime().toString(), + is(Calendar.getInstance().getTime().toString())); + assertThat(mDateUtil.convertDateFromServerFormatToCalendar("").getTime().toString(), + is(Calendar.getInstance().getTime().toString())); + } + + @Test + public void testConvertDateFromServerFormatToCalendar() throws ParseException { + String serverDate = "2005-05-23"; + final Calendar mayCalendar = Calendar.getInstance(); + mayCalendar.set(2005, 4, 23, 0, 0, 0); + assertThat(mDateUtil.convertDateFromServerFormatToCalendar(serverDate).getTime().toString(), + is(mayCalendar.getTime().toString())); + } + + @Test + public void testBuildDateFromDateDialogToServerFormat() { + String widgetDate; + int year; + int month; + int dayOfMonth; + Collection inputParamList = buildParamsFromDialogToServer(); + for (Object[] item : inputParamList) { + year = (int) item[0]; + month = (int) item[1]; + dayOfMonth = (int) item[2]; + widgetDate = (String) item[3]; + assertThat(mDateUtil.buildDateFromDateDialogToServerFormat(year, month, dayOfMonth), is(widgetDate)); + } + } + + private Collection buildParamsFromDialogToServer() { + return Arrays.asList(new Object[][]{ + {1900, 0, 1, "1900-01-01"}, + {2000, 11, 31, "2000-12-31"}, + {2001, 10, 13, "2001-11-13"} + }); + } +} \ No newline at end of file