Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Date Picker Constraint Issue Fix. #2514

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

AdityaKBhadragond14
Copy link

@AdityaKBhadragond14 AdityaKBhadragond14 commented Apr 18, 2024

IMPORTANT: All PRs must be linked to an issue (except for extremely trivial and straightforward changes).

Fixes #2508

Description
The MaterialDatePicker Builder has been modified such that if the questionnaire item has the minimum date extension added then the MaterialDatePicker.setSelection() will have that minimum date from extension else it will get the local date. This way it will select the first valid date based on the constraints added for date.

Alternative(s) considered
Have you considered any alternatives? And if so, why have you chosen the approach in this PR?

Type
Bug Fix

Screenshots (if applicable)

Checklist

  • I have read and acknowledged the Code of conduct.
  • I have read the Contributing page.
  • I have signed the Google Individual CLA, or I am covered by my company's Corporate CLA.
  • I have discussed my proposed solution with code owners in the linked issue(s) and we have agreed upon the general approach.
  • I have run ./gradlew spotlessApply and ./gradlew spotlessCheck to check my code follows the style guide of this project.
  • I have run ./gradlew check and ./gradlew connectedCheck to test my changes locally.
  • I have built and run the demo app(s) to verify my change fixes the issue and/or does not break the demo app(s).

Copy link
Collaborator

@MJ1998 MJ1998 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Aditya for this PR. Can you address the comments ?

@AdityaKBhadragond14
Copy link
Author

Thanks Aditya for this PR. Can you address the comments ?

I have addressed the comments. Please do a re-review. Thanks.

Copy link
Collaborator

@MJ1998 MJ1998 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@MJ1998
Copy link
Collaborator

MJ1998 commented Jun 3, 2024

Hi @AdityaKBhadragond14

It seems the build is failing on few tests in QuestionnaireUiEspressoTest. It's not available via kokoro logs here and we are working on it via this ticket Issue/2515.

In the meantime these are the errors:-
Screenshot 2024-06-03 at 6 11 16 PM

This should be an easy fix. Requesting you to fix these and upload a commit. It will automatically merge the PR.
Thanks and apologies for the late response on this.

@AdityaKBhadragond14
Copy link
Author

Hi @AdityaKBhadragond14

It seems the build is failing on few tests in QuestionnaireUiEspressoTest. It's not available via kokoro logs here and we are working on it via this ticket Issue/2515.

In the meantime these are the errors:- Screenshot 2024-06-03 at 6 11 16 PM

This should be an easy fix. Requesting you to fix these and upload a commit. It will automatically merge the PR. Thanks and apologies for the late response on this.

Sure @MJ1998 . I will do it. Thanks.

Comment on lines +158 to +167
(questionnaireViewItem.minAnswerValue as? DateType)
?.value
?.localDate
?.atStartOfDay(
ZONE_ID_UTC,
)
?.toInstant()
?.toEpochMilli()
?: localDate?.atStartOfDay(ZONE_ID_UTC)?.toInstant()?.toEpochMilli()
?: MaterialDatePicker.todayInUtcMilliseconds()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

some of this can probably be simplified, the conversion from local date to epoch milli is the same for the min value and the local date input, so you can simplify this code a bit by rewriting that.

but the bigger question is why this logic is written as such - you're reading from the questionnaire constraint's min value, and if it's missing, then you take the input value (which could have been an input from before, and then if that's also missing, you take today's date. and then you set this as the selection. and then you use this for two things: 1) the selection for the date picker and 2) the min date for the calendar constraint. i don't really understand why this is done this way.

to me, a perhaps much simpler fix is to simply not set the selection below:

.setSelection(selectedDateMillis)

if the selection will not make any sense. have you tried removing this line?

in that case i'd imagine the behaviour of the date picker will be that you cannot click ok since there simply isn't any possible date to choose from that would satisfy the calendar constraints.

have you tried that? i feel that's a more logical fix.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @jingtang10 , this makes sense. Removing the .setSelection(selectedDateMillis) will disable the "ok" button and enable only when selected a date. I think this could be more better fix than what I had proposed. Thanks for pointing it out.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you still to set the selection if there is an existing answer right? why are you removing it completely?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The idea here is to streamline user experience, Jing. This is what I had in mind:-
Invalid Date Range: If minDate is later than maxDate, disable the date picker and display a clear error message.
Existing Answer: If the user has already selected a date (i.e., localDate is not null), set the date picker to that value.
No Answer, Valid Range: If there's no previous answer but the date range is valid:

  1. Prioritize Today's Date: Since users are likely to choose today's date, set the date picker to the today's date if it falls within the valid range (minDate to maxDate).
  2. Fallback to minDate: If today's date is outside the valid range, use minDate as the default selection to avoid excessive scrolling or clicking for the user.

Notes:-

  1. Once user selects a valid date, ie, localDate is non null, then we should set the date picker to that value only.
  2. minDateInMillis should be calculated solely based on minValueAnswer, not influenced by the user's current selection or the current date.

So I guess something like following:-

val dateToSelect = when { 
    localDate != null -> localDate
    currentDate between minDate..maxDate -> currentDate 
    else -> minDate // If not in range, minDate fallback
}

auto-merge was automatically disabled June 6, 2024 12:50

Head branch was pushed to by a user without write access

@AdityaKBhadragond14
Copy link
Author

@jingtang10 I have made the changes please have a look. Thanks.

Comment on lines +158 to +167
(questionnaireViewItem.minAnswerValue as? DateType)
?.value
?.localDate
?.atStartOfDay(
ZONE_ID_UTC,
)
?.toInstant()
?.toEpochMilli()
?: localDate?.atStartOfDay(ZONE_ID_UTC)?.toInstant()?.toEpochMilli()
?: MaterialDatePicker.todayInUtcMilliseconds()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

you still to set the selection if there is an existing answer right? why are you removing it completely?

@AdityaKBhadragond14
Copy link
Author

Ohh I am sorry, I misunderstood it. You mean the existing answer will come from the Questionnaire? @jingtang10

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: PR under Review
Development

Successfully merging this pull request may close these issues.

Date Picker Constraint Not Enforced on 'Ok' Button Click.
4 participants