Validating Date+Time pickers

136 views Asked by At

I am polishing up my app and trying to ensure that it cannot be broken. I have a CreateLine page with a save button at the end. I am doing tests and tried to break my application by clicking the Save button before choosing a date or time picker and the app crashes. Basically what I want to happen is that it displays an alert dialog to say something like "ensure all fields have been entered".

The thing is I am using JODA-TIME and I am not quite sure how I can check or validate this?? I have added below the code that I have for my pickers and my save button:

Date + Time Pickers:

 datePickerButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            DatePickerDialog datePickerDialog = new DatePickerDialog(CreateLine.this, new DatePickerDialog.OnDateSetListener() {

                @Override
                public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {


                    monthOfYear = monthOfYear + 1;
                    String Sd = String.valueOf(dayOfMonth + "/" + monthOfYear + "/" + year);

                    datePickerButton.setText(Sd);

                    yearNow = year;
                    monthNow = monthOfYear;
                    dayNow = dayOfMonth;

                }


            }, displayCurrentYear, displayCurrentMonth, displayCurrentDay);


            datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
            datePickerDialog.show();
        }


    });

    timePickerButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            TimePickerDialog timePickerDialog = new TimePickerDialog(CreateLine.this, new TimePickerDialog.OnTimeSetListener() {

                @Override
                public void onTimeSet(TimePicker timePicker, int hour, int minute) {

                    hourNow = hour;
                    minuteNow = minute;

                    String St = String.format("%02d:%02d", hour, minute);
                    timePickerButton.setText(St);



                }
            }, displayCurrentHour, displayCurrentMinute, isTwentyFourHrsNow);

            timePickerDialog.show();
        }
    });

SAVE button:

VerifyButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            if (spinner.getSelectedItem().toString().equals("Select Line Type") || spinner2.getSelectedItem().toString().equals("Select Package Type")) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
                    builder.setTitle("Data Input Error");
                    builder.setMessage("Please Ensure that all fields have been selected before Saving!");
                    builder.setIcon(R.drawable.warning_icon);
                    builder.setCancelable(true);

                    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });

                    builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
                    AlertDialog alert = builder.create();
                    alert.show();
                } else if (monthNow >= 1 && monthNow <= 12) {

                    spinnerSelection = String.valueOf(spinner.getSelectedItem());
                    spinnerSelection2 = String.valueOf(spinner2.getSelectedItem());
                    String q = quantity.getText().toString();
                    String d = duration.getText().toString();

                    DateTime datetime = new DateTime(yearNow, monthNow, dayNow, hourNow, minuteNow);
                    DateTimeFormatter fmt = DateTimeFormat.forPattern("EE dd MM yyyy" + "\n" + " h:mm a ");
                    String formattedtime = fmt.print(datetime);
                    CalculateButton.setText(formattedtime);

                    // Plus some hours, minutes, and seconds to the original DateTime.
                    DateTimeFormatter fmt2 = DateTimeFormat.forPattern("EE dd MM yyyy" + "\n" + " h:mm a ");

                    DateTime dateTime1 = datetime.plusHours(timeadded);
                    String endtimecalc = fmt2.print(dateTime1);
                    TextView endtime = findViewById(endtimetextView);
                    endtime.setVisibility(View.VISIBLE);
                    endtime.setText(endtimecalc);

                    //INSERT DATA TO DATABASE
                    boolean isInserted = myDb.insertData(
                            spinnerSelection,
                            spinnerSelection2,
                            q,
                            d,
                            formattedtime,
                            endtimecalc);


                    if (isInserted == true) {
                        Toast.makeText(CreateLine.this, "Data Inserted Successfully", Toast.LENGTH_LONG).show();
                        Intent intent = new Intent(CreateLine.this, Dashboard.class);
                        startActivity(intent);
                    } else if (isInserted == false) {
                        AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
                        builder.setTitle("Save Data Error");
                        builder.setMessage("Data for this Line already exists.." + "\n" + "Please Clear Line First!");
                        builder.setIcon(R.drawable.warning_icon);
                        builder.setCancelable(true);

                        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                Intent intent = new Intent(CreateLine.this, Dashboard.class);
                                startActivity(intent);
                            }
                        });

                        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                        AlertDialog alert = builder.create();
                        alert.show();
                    } else {
                        AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
                        builder.setTitle("Save Data Error");
                        builder.setMessage("No Data has been entered!");
                        builder.setIcon(R.drawable.warning_icon);
                        builder.setCancelable(true);

                        builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });

                        builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.cancel();
                            }
                        });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
                }
        }
    });
}

}

Here is the Logcat error that I am receiving:

org.joda.time.IllegalFieldValueException: Value 0 for monthOfYear must be in the range [1,12] at org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:275) at org.joda.time.chrono.BasicChronology.getDateMidnightMillis(BasicChronology.java:631) at org.joda.time.chrono.BasicChronology.getDateTimeMillis0(BasicChronology.java:186) at org.joda.time.chrono.BasicChronology.getDateTimeMillis(BasicChronology.java:182) at org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133) at org.joda.time.chrono.ZonedChronology.getDateTimeMillis(ZonedChronology.java:122) at org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133) at org.joda.time.base.BaseDateTime.(BaseDateTime.java:257) at org.joda.time.base.BaseDateTime.(BaseDateTime.java:198) at org.joda.time.DateTime.(DateTime.java:323) at com.almac.tracker.CreateLine$6.onClick(CreateLine.java:313)

LINE 313:

DateTime datetime = new DateTime(yearNow, monthNow, dayNow, hourNow, minuteNow);

Does anyone know how I can Check or Validate this??

1

There are 1 answers

2
mavriksc On
VerifyButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        if(monthNow>=1 && monthNow <=12){
            doWhatYouDoNow;
        } else {
            alert(errorMsg);
        }
    }
}

or instead of just checking the month you could make a method to validate all params and return a map of error messages to then display to user.