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??
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.