Skip to content

Commit cb5d622

Browse files
drchenhunterstich
authored andcommitted
[DatePicker] Avoid NPE caused by getSelection() before created
Resolves #2169 PiperOrigin-RevId: 381325077
1 parent 9a603aa commit cb5d622

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

lib/java/com/google/android/material/datepicker/MaterialDatePicker.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static long thisMonthInUtcMilliseconds() {
102102
* <p>The text is updated when the Dialog launches and on user clicks.
103103
*/
104104
public String getHeaderText() {
105-
return dateSelector.getSelectionDisplayString(getContext());
105+
return getDateSelector().getSelectionDisplayString(getContext());
106106
}
107107

108108
private final LinkedHashSet<MaterialPickerOnPositiveButtonClickListener<? super S>>
@@ -175,7 +175,7 @@ private int getThemeResId(Context context) {
175175
if (overrideThemeResId != 0) {
176176
return overrideThemeResId;
177177
}
178-
return dateSelector.getDefaultThemeResId(context);
178+
return getDateSelector().getDefaultThemeResId(context);
179179
}
180180

181181
@NonNull
@@ -234,7 +234,7 @@ public final View onCreateView(
234234
initHeaderToggle(context);
235235

236236
confirmButton = root.findViewById(R.id.confirm_button);
237-
if (dateSelector.isSelectionComplete()) {
237+
if (getDateSelector().isSelectionComplete()) {
238238
confirmButton.setEnabled(true);
239239
} else {
240240
confirmButton.setEnabled(false);
@@ -320,7 +320,7 @@ public final void onDismiss(@NonNull DialogInterface dialogInterface) {
320320
*/
321321
@Nullable
322322
public final S getSelection() {
323-
return dateSelector.getSelection();
323+
return getDateSelector().getSelection();
324324
}
325325

326326
private void updateHeader() {
@@ -332,10 +332,11 @@ private void updateHeader() {
332332

333333
private void startPickerFragment() {
334334
int themeResId = getThemeResId(requireContext());
335-
calendar = MaterialCalendar.newInstance(dateSelector, themeResId, calendarConstraints);
335+
calendar = MaterialCalendar.newInstance(getDateSelector(), themeResId, calendarConstraints);
336336
pickerFragment =
337337
headerToggleButton.isChecked()
338-
? MaterialTextInputPicker.newInstance(dateSelector, themeResId, calendarConstraints)
338+
? MaterialTextInputPicker.newInstance(
339+
getDateSelector(), themeResId, calendarConstraints)
339340
: calendar;
340341
updateHeader();
341342

@@ -348,7 +349,7 @@ private void startPickerFragment() {
348349
@Override
349350
public void onSelectionChanged(S selection) {
350351
updateHeader();
351-
confirmButton.setEnabled(dateSelector.isSelectionComplete());
352+
confirmButton.setEnabled(getDateSelector().isSelectionComplete());
352353
}
353354

354355
@Override
@@ -372,7 +373,7 @@ private void initHeaderToggle(Context context) {
372373
@Override
373374
public void onClick(View v) {
374375
// Update confirm button in case in progress selection has been reset
375-
confirmButton.setEnabled(dateSelector.isSelectionComplete());
376+
confirmButton.setEnabled(getDateSelector().isSelectionComplete());
376377

377378
headerToggleButton.toggle();
378379
updateToggleContentDescription(headerToggleButton);
@@ -389,6 +390,13 @@ private void updateToggleContentDescription(@NonNull CheckableImageButton toggle
389390
headerToggleButton.setContentDescription(contentDescription);
390391
}
391392

393+
private DateSelector<S> getDateSelector() {
394+
if (dateSelector == null) {
395+
dateSelector = getArguments().getParcelable(DATE_SELECTOR_KEY);
396+
}
397+
return dateSelector;
398+
}
399+
392400
// Create StateListDrawable programmatically for pre-lollipop support
393401
@NonNull
394402
private static Drawable createHeaderToggleDrawable(Context context) {

0 commit comments

Comments
 (0)