1414import android .os .Bundle ;
1515import android .widget .DatePicker ;
1616import androidx .annotation .NonNull ;
17- import androidx .annotation .Nullable ;
1817import androidx .fragment .app .FragmentActivity ;
1918import androidx .fragment .app .FragmentManager ;
2019
2322import com .facebook .react .module .annotations .ReactModule ;
2423
2524import static com .reactcommunity .rndatetimepicker .Common .dismissDialog ;
25+ import static com .reactcommunity .rndatetimepicker .KeepDateInRangeListener .isDateAfterMaxDate ;
26+ import static com .reactcommunity .rndatetimepicker .KeepDateInRangeListener .isDateBeforeMinDate ;
27+
28+ import java .util .Calendar ;
2629
2730/**
2831 * {@link NativeModule} that allows JS to show a native date picker dialog and get called back when
@@ -46,10 +49,12 @@ public RNDatePickerDialogModule(ReactApplicationContext reactContext) {
4649 private class DatePickerDialogListener implements OnDateSetListener , OnDismissListener , OnClickListener {
4750
4851 private final Promise mPromise ;
52+ private final Bundle mArgs ;
4953 private boolean mPromiseResolved = false ;
5054
51- public DatePickerDialogListener (final Promise promise ) {
55+ public DatePickerDialogListener (final Promise promise , Bundle arguments ) {
5256 mPromise = promise ;
57+ mArgs = arguments ;
5358 }
5459
5560 @ Override
@@ -60,6 +65,27 @@ public void onDateSet(DatePicker view, int year, int month, int day) {
6065 result .putInt ("year" , year );
6166 result .putInt ("month" , month );
6267 result .putInt ("day" , day );
68+
69+ // https://issuetracker.google.com/issues/169602180
70+ // TODO revisit day, month, year with timezoneoffset fixes
71+ if (isDateAfterMaxDate (mArgs , year , month , day )) {
72+ Calendar maxDate = Calendar .getInstance ();
73+ maxDate .setTimeInMillis (mArgs .getLong (RNConstants .ARG_MAXDATE ));
74+
75+ result .putInt ("year" , maxDate .get (Calendar .YEAR ));
76+ result .putInt ("month" , maxDate .get (Calendar .MONTH ) );
77+ result .putInt ("day" , maxDate .get (Calendar .DAY_OF_MONTH ));
78+ }
79+
80+ if (isDateBeforeMinDate (mArgs , year , month , day )) {
81+ Calendar minDate = Calendar .getInstance ();
82+ minDate .setTimeInMillis (mArgs .getLong (RNConstants .ARG_MINDATE ));
83+
84+ result .putInt ("year" , minDate .get (Calendar .YEAR ));
85+ result .putInt ("month" , minDate .get (Calendar .MONTH ) );
86+ result .putInt ("day" , minDate .get (Calendar .DAY_OF_MONTH ));
87+ }
88+
6389 mPromise .resolve (result );
6490 mPromiseResolved = true ;
6591 }
@@ -117,7 +143,7 @@ public void dismiss(Promise promise) {
117143 * dismiss, year, month and date are undefined.
118144 */
119145 @ ReactMethod
120- public void open (@ Nullable final ReadableMap options , final Promise promise ) {
146+ public void open (final ReadableMap options , final Promise promise ) {
121147 FragmentActivity activity = (FragmentActivity ) getCurrentActivity ();
122148 if (activity == null ) {
123149 promise .reject (
@@ -134,18 +160,16 @@ public void run() {
134160 RNDatePickerDialogFragment oldFragment =
135161 (RNDatePickerDialogFragment ) fragmentManager .findFragmentByTag (FRAGMENT_TAG );
136162
137- if (oldFragment != null && options != null ) {
163+ if (oldFragment != null ) {
138164 oldFragment .update (createFragmentArguments (options ));
139165 return ;
140166 }
141167
142168 RNDatePickerDialogFragment fragment = new RNDatePickerDialogFragment ();
143169
144- if (options != null ) {
145- fragment .setArguments (createFragmentArguments (options ));
146- }
170+ fragment .setArguments (createFragmentArguments (options ));
147171
148- final DatePickerDialogListener listener = new DatePickerDialogListener (promise );
172+ final DatePickerDialogListener listener = new DatePickerDialogListener (promise , createFragmentArguments ( options ) );
149173 fragment .setOnDismissListener (listener );
150174 fragment .setOnDateSetListener (listener );
151175 fragment .setOnNeutralButtonActionListener (listener );
0 commit comments