Skip to content

Commit 5134f08

Browse files
author
Martijn Swaagman
committed
[minor] ensure timepicker can be updated
1 parent 432ad85 commit 5134f08

File tree

6 files changed

+77
-125
lines changed

6 files changed

+77
-125
lines changed

android/src/main/java/com/reactcommunity/rndatetimepicker/RNDatePickerDialogFragment.java

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -24,37 +24,10 @@
2424
import androidx.fragment.app.DialogFragment;
2525
import android.widget.DatePicker;
2626

27-
class Date {
28-
private int year;
29-
private int month;
30-
private int day;
31-
32-
public Date(Bundle args) {
33-
final Calendar c = Calendar.getInstance();
34-
35-
if (args != null && args.containsKey(RNDatePickerDialogModule.ARG_DATE)) {
36-
c.setTimeInMillis(args.getLong(RNDatePickerDialogModule.ARG_DATE));
37-
38-
this.year = c.get(Calendar.YEAR);
39-
this.month = c.get(Calendar.MONTH);
40-
this.day = c.get(Calendar.DAY_OF_MONTH);
41-
}
42-
}
43-
44-
public int getYear() { return this.year; }
45-
public int getMonth() { return this.month; }
46-
public int getDay() { return this.day; }
47-
}
48-
4927
@SuppressLint("ValidFragment")
5028
public class RNDatePickerDialogFragment extends DialogFragment {
5129
private DatePickerDialog instance;
5230

53-
/**
54-
* Minimum date supported by {@link DatePicker}, 01 Jan 1900
55-
*/
56-
private static final long DEFAULT_MIN_DATE = -2208988800001l;
57-
5831
@Nullable
5932
private OnDateSetListener mOnDateSetListener;
6033
@Nullable
@@ -67,43 +40,43 @@ public Dialog onCreateDialog(Bundle savedInstanceState) {
6740
return instance;
6841
}
6942

70-
public void updateDate(Bundle args) {
71-
final Date date = new Date(args);
72-
instance.updateDate(date.getYear(), date.getMonth(), date.getDay());
43+
public void update(Bundle args) {
44+
final RNDate date = new RNDate(args);
45+
instance.updateDate(date.year(), date.month(), date.day());
7346
}
7447

7548
static DatePickerDialog createDialog(Bundle args, Context activityContext, @Nullable OnDateSetListener onDateSetListener) {
76-
RNDatePickerMode mode = RNDatePickerMode.DEFAULT;
77-
7849
final Calendar c = Calendar.getInstance();
79-
final Date date = new Date(args);
80-
81-
if (args != null && args.getString(RNDatePickerDialogModule.ARG_MODE, null) != null) {
82-
mode = RNDatePickerMode.valueOf(args.getString(RNDatePickerDialogModule.ARG_MODE).toUpperCase(Locale.US));
83-
}
50+
final RNDate date = new RNDate(args);
51+
final int year = date.year();
52+
final int month = date.month();
53+
final int day = date.day();
8454

55+
RNDatePickerMode mode = RNDatePickerMode.DEFAULT;
8556
DatePickerDialog dialog = null;
8657

58+
if (args != null && args.getString(RNConstants.ARG_MODE, null) != null) {
59+
mode = RNDatePickerMode.valueOf(args.getString(RNConstants.ARG_MODE).toUpperCase(Locale.US));
60+
}
61+
8762
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
8863
switch (mode) {
8964
case CALENDAR:
9065
dialog = new RNDismissableDatePickerDialog(activityContext,
9166
activityContext.getResources().getIdentifier("CalendarDatePickerDialog", "style", activityContext.getPackageName()),
92-
onDateSetListener, date.getYear(), date.getMonth(), date.getDay());
67+
onDateSetListener, year, month, day);
9368
break;
9469
case SPINNER:
9570
dialog = new RNDismissableDatePickerDialog(activityContext,
9671
activityContext.getResources().getIdentifier("SpinnerDatePickerDialog", "style", activityContext.getPackageName()),
97-
onDateSetListener, date.getYear(), date.getMonth(), date.getDay());
72+
onDateSetListener, year, month, day);
9873
break;
9974
case DEFAULT:
100-
dialog = new RNDismissableDatePickerDialog(activityContext, onDateSetListener,
101-
date.getYear(), date.getMonth(), date.getDay());
75+
dialog = new RNDismissableDatePickerDialog(activityContext, onDateSetListener, year, month, day);
10276
break;
10377
}
10478
} else {
105-
dialog = new RNDismissableDatePickerDialog(activityContext, onDateSetListener,
106-
date.getYear(), date.getMonth(), date.getDay());
79+
dialog = new RNDismissableDatePickerDialog(activityContext, onDateSetListener, year, month, day);
10780

10881
switch (mode) {
10982
case CALENDAR:
@@ -118,11 +91,11 @@ static DatePickerDialog createDialog(Bundle args, Context activityContext, @Null
11891

11992
final DatePicker datePicker = dialog.getDatePicker();
12093

121-
if (args != null && args.containsKey(RNDatePickerDialogModule.ARG_MINDATE)) {
94+
if (args != null && args.containsKey(RNConstants.ARG_MINDATE)) {
12295
// Set minDate to the beginning of the day. We need this because of clowniness in datepicker
12396
// that causes it to throw an exception if minDate is greater than the internal timestamp
12497
// that it generates from the y/m/d passed in the constructor.
125-
c.setTimeInMillis(args.getLong(RNDatePickerDialogModule.ARG_MINDATE));
98+
c.setTimeInMillis(args.getLong(RNConstants.ARG_MINDATE));
12699
c.set(Calendar.HOUR_OF_DAY, 0);
127100
c.set(Calendar.MINUTE, 0);
128101
c.set(Calendar.SECOND, 0);
@@ -131,11 +104,11 @@ static DatePickerDialog createDialog(Bundle args, Context activityContext, @Null
131104
} else {
132105
// This is to work around a bug in DatePickerDialog where it doesn't display a title showing
133106
// the date under certain conditions.
134-
datePicker.setMinDate(DEFAULT_MIN_DATE);
107+
datePicker.setMinDate(RNConstants.DEFAULT_MIN_DATE);
135108
}
136-
if (args != null && args.containsKey(RNDatePickerDialogModule.ARG_MAXDATE)) {
109+
if (args != null && args.containsKey(RNConstants.ARG_MAXDATE)) {
137110
// Set maxDate to the end of the day, same reason as for minDate.
138-
c.setTimeInMillis(args.getLong(RNDatePickerDialogModule.ARG_MAXDATE));
111+
c.setTimeInMillis(args.getLong(RNConstants.ARG_MAXDATE));
139112
c.set(Calendar.HOUR_OF_DAY, 23);
140113
c.set(Calendar.MINUTE, 59);
141114
c.set(Calendar.SECOND, 59);

android/src/main/java/com/reactcommunity/rndatetimepicker/RNDatePickerDialogModule.java

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@
77

88
package com.reactcommunity.rndatetimepicker;
99

10-
import android.app.Dialog;
11-
import android.app.DatePickerDialog;
1210
import android.app.DatePickerDialog.OnDateSetListener;
1311
import android.content.DialogInterface;
1412
import android.content.DialogInterface.OnDismissListener;
1513
import android.os.Bundle;
16-
import androidx.fragment.app.DialogFragment;
1714
import androidx.fragment.app.FragmentActivity;
1815
import androidx.fragment.app.FragmentManager;
1916
import android.widget.DatePicker;
17+
2018
import com.facebook.react.bridge.*;
2119
import com.facebook.react.common.annotations.VisibleForTesting;
2220
import com.facebook.react.module.annotations.ReactModule;
@@ -34,16 +32,6 @@ public class RNDatePickerDialogModule extends ReactContextBaseJavaModule {
3432
@VisibleForTesting
3533
public static final String FRAGMENT_TAG = "RNDatePickerAndroid";
3634

37-
private static final String ERROR_NO_ACTIVITY = "E_NO_ACTIVITY";
38-
39-
/* package */ static final String ARG_DATE = "date";
40-
/* package */ static final String ARG_MINDATE = "minimumDate";
41-
/* package */ static final String ARG_MAXDATE = "maximumDate";
42-
/* package */ static final String ARG_MODE = "mode";
43-
44-
/* package */ static final String ACTION_DATE_SET = "dateSetAction";
45-
/* package */ static final String ACTION_DISMISSED = "dismissedAction";
46-
4735
public RNDatePickerDialogModule(ReactApplicationContext reactContext) {
4836
super(reactContext);
4937
}
@@ -66,7 +54,7 @@ public DatePickerDialogListener(final Promise promise) {
6654
public void onDateSet(DatePicker view, int year, int month, int day) {
6755
if (!mPromiseResolved && getReactApplicationContext().hasActiveCatalystInstance()) {
6856
WritableMap result = new WritableNativeMap();
69-
result.putString("action", ACTION_DATE_SET);
57+
result.putString("action", RNConstants.ACTION_DATE_SET);
7058
result.putInt("year", year);
7159
result.putInt("month", month);
7260
result.putInt("day", day);
@@ -79,7 +67,7 @@ public void onDateSet(DatePicker view, int year, int month, int day) {
7967
public void onDismiss(DialogInterface dialog) {
8068
if (!mPromiseResolved && getReactApplicationContext().hasActiveCatalystInstance()) {
8169
WritableMap result = new WritableNativeMap();
82-
result.putString("action", ACTION_DISMISSED);
70+
result.putString("action", RNConstants.ACTION_DISMISSED);
8371
mPromise.resolve(result);
8472
mPromiseResolved = true;
8573
}
@@ -116,7 +104,7 @@ public void open(@Nullable final ReadableMap options, Promise promise) {
116104
FragmentActivity activity = (FragmentActivity) getCurrentActivity();
117105
if (activity == null) {
118106
promise.reject(
119-
ERROR_NO_ACTIVITY,
107+
RNConstants.ERROR_NO_ACTIVITY,
120108
"Tried to open a DatePicker dialog while not attached to an Activity");
121109
return;
122110
}
@@ -128,7 +116,7 @@ public void open(@Nullable final ReadableMap options, Promise promise) {
128116
UiThreadUtil.runOnUiThread(new Runnable() {
129117
@Override
130118
public void run() {
131-
oldFragment.updateDate(createFragmentArguments(options));
119+
oldFragment.update(createFragmentArguments(options));
132120
}
133121
});
134122

@@ -149,17 +137,17 @@ public void run() {
149137

150138
private Bundle createFragmentArguments(ReadableMap options) {
151139
final Bundle args = new Bundle();
152-
if (options.hasKey(ARG_DATE) && !options.isNull(ARG_DATE)) {
153-
args.putLong(ARG_DATE, (long) options.getDouble(ARG_DATE));
140+
if (options.hasKey(RNConstants.ARG_VALUE) && !options.isNull(RNConstants.ARG_VALUE)) {
141+
args.putLong(RNConstants.ARG_VALUE, (long) options.getDouble(RNConstants.ARG_VALUE));
154142
}
155-
if (options.hasKey(ARG_MINDATE) && !options.isNull(ARG_MINDATE)) {
156-
args.putLong(ARG_MINDATE, (long) options.getDouble(ARG_MINDATE));
143+
if (options.hasKey(RNConstants.ARG_MINDATE) && !options.isNull(RNConstants.ARG_MINDATE)) {
144+
args.putLong(RNConstants.ARG_MINDATE, (long) options.getDouble(RNConstants.ARG_MINDATE));
157145
}
158-
if (options.hasKey(ARG_MAXDATE) && !options.isNull(ARG_MAXDATE)) {
159-
args.putLong(ARG_MAXDATE, (long) options.getDouble(ARG_MAXDATE));
146+
if (options.hasKey(RNConstants.ARG_MAXDATE) && !options.isNull(RNConstants.ARG_MAXDATE)) {
147+
args.putLong(RNConstants.ARG_MAXDATE, (long) options.getDouble(RNConstants.ARG_MAXDATE));
160148
}
161-
if (options.hasKey(ARG_MODE) && !options.isNull(ARG_MODE)) {
162-
args.putString(ARG_MODE, options.getString(ARG_MODE));
149+
if (options.hasKey(RNConstants.ARG_MODE) && !options.isNull(RNConstants.ARG_MODE)) {
150+
args.putString(RNConstants.ARG_MODE, options.getString(RNConstants.ARG_MODE));
163151
}
164152
return args;
165153
}

android/src/main/java/com/reactcommunity/rndatetimepicker/RNTimePickerDialogFragment.java

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.reactcommunity.rndatetimepicker;
99

1010
import android.app.Dialog;
11+
import android.app.TimePickerDialog;
1112
import android.app.TimePickerDialog.OnTimeSetListener;
1213
import android.content.Context;
1314
import android.content.DialogInterface;
@@ -24,6 +25,7 @@
2425

2526
@SuppressWarnings("ValidFragment")
2627
public class RNTimePickerDialogFragment extends DialogFragment {
28+
private TimePickerDialog instance;
2729

2830
@Nullable
2931
private OnTimeSetListener mOnTimeSetListener;
@@ -33,28 +35,28 @@ public class RNTimePickerDialogFragment extends DialogFragment {
3335
@Override
3436
public Dialog onCreateDialog(Bundle savedInstanceState) {
3537
final Bundle args = getArguments();
36-
return createDialog(args, getActivity(), mOnTimeSetListener);
38+
instance = createDialog(args, getActivity(), mOnTimeSetListener);
39+
return instance;
3740
}
3841

39-
/*package*/ static Dialog createDialog(
40-
Bundle args, Context activityContext, @Nullable OnTimeSetListener onTimeSetListener
41-
) {
42-
final Calendar now = Calendar.getInstance();
43-
int hour = now.get(Calendar.HOUR_OF_DAY);
44-
int minute = now.get(Calendar.MINUTE);
42+
public void update(Bundle args) {
43+
final RNDate date = new RNDate(args);
44+
instance.updateTime(date.hour(), date.minute());
45+
}
46+
47+
static TimePickerDialog createDialog(Bundle args, Context activityContext, @Nullable OnTimeSetListener onTimeSetListener) {
48+
final RNDate date = new RNDate(args);
49+
final int hour = date.hour();
50+
final int minute = date.minute();
4551
boolean is24hour = DateFormat.is24HourFormat(activityContext);
4652

4753
RNTimePickerMode mode = RNTimePickerMode.DEFAULT;
48-
if (args != null && args.getString(RNTimePickerDialogModule.ARG_MODE, null) != null) {
49-
mode = RNTimePickerMode.valueOf(args.getString(RNTimePickerDialogModule.ARG_MODE).toUpperCase(Locale.US));
54+
if (args != null && args.getString(RNConstants.ARG_MODE, null) != null) {
55+
mode = RNTimePickerMode.valueOf(args.getString(RNConstants.ARG_MODE).toUpperCase(Locale.US));
5056
}
5157

5258
if (args != null) {
53-
hour = args.getInt(RNTimePickerDialogModule.ARG_HOUR, now.get(Calendar.HOUR_OF_DAY));
54-
minute = args.getInt(RNTimePickerDialogModule.ARG_MINUTE, now.get(Calendar.MINUTE));
55-
is24hour = args.getBoolean(
56-
RNTimePickerDialogModule.ARG_IS24HOUR,
57-
DateFormat.is24HourFormat(activityContext));
59+
is24hour = args.getBoolean(RNConstants.ARG_IS24HOUR, DateFormat.is24HourFormat(activityContext));
5860
}
5961

6062
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

0 commit comments

Comments
 (0)