diff --git a/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java b/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java index 9dc319d35d6..8096adf00f0 100644 --- a/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java +++ b/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java @@ -38,7 +38,6 @@ import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; -import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.Button; @@ -188,6 +187,7 @@ public final void onSaveInstanceState(@NonNull Bundle bundle) { bundle.putParcelable(DAY_VIEW_DECORATOR_KEY, dayViewDecorator); bundle.putInt(TITLE_TEXT_RES_ID_KEY, titleTextResId); bundle.putCharSequence(TITLE_TEXT_KEY, titleText); + bundle.putInt(INPUT_MODE_KEY, inputMode); bundle.putInt(POSITIVE_BUTTON_TEXT_RES_ID_KEY, positiveButtonTextResId); bundle.putCharSequence(POSITIVE_BUTTON_TEXT_KEY, positiveButtonText); bundle.putInt(NEGATIVE_BUTTON_TEXT_RES_ID_KEY, negativeButtonTextResId); @@ -384,6 +384,12 @@ public final S getSelection() { return getDateSelector().getSelection(); } + /** Returns the current {@link InputMode}. */ + @InputMode + public int getInputMode() { + return inputMode; + } + private void enableEdgeToEdgeIfNeeded(Window window) { if (edgeToEdgeEnabled) { // Avoid enabling edge-to-edge multiple times. @@ -415,10 +421,10 @@ public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) edgeToEdgeEnabled = true; } - private void updateTitle(boolean textInputMode) { + private void updateTitle() { // Set up title text forcing single line for landscape text input mode due to space constraints. headerTitleTextView.setText( - textInputMode && isLandscape() ? singleLineTitleText : fullTitleText); + inputMode == INPUT_MODE_TEXT && isLandscape() ? singleLineTitleText : fullTitleText); } @VisibleForTesting @@ -436,13 +442,13 @@ private void startPickerFragment() { calendar = MaterialCalendar.newInstance( getDateSelector(), themeResId, calendarConstraints, dayViewDecorator); - boolean textInputMode = headerToggleButton.isChecked(); + pickerFragment = - textInputMode + inputMode == INPUT_MODE_TEXT ? MaterialTextInputPicker.newInstance( getDateSelector(), themeResId, calendarConstraints) : calendar; - updateTitle(textInputMode); + updateTitle(); updateHeader(getHeaderText()); FragmentTransaction fragmentTransaction = getChildFragmentManager().beginTransaction(); @@ -474,22 +480,20 @@ private void initHeaderToggle(Context context) { ViewCompat.setAccessibilityDelegate(headerToggleButton, null); updateToggleContentDescription(headerToggleButton); headerToggleButton.setOnClickListener( - new OnClickListener() { - @Override - public void onClick(View v) { - // Update confirm button in case in progress selection has been reset - confirmButton.setEnabled(getDateSelector().isSelectionComplete()); - - headerToggleButton.toggle(); - updateToggleContentDescription(headerToggleButton); - startPickerFragment(); - } + v -> { + // Update confirm button in case in progress selection has been reset + confirmButton.setEnabled(getDateSelector().isSelectionComplete()); + + headerToggleButton.toggle(); + inputMode = (inputMode == INPUT_MODE_TEXT) ? INPUT_MODE_CALENDAR : INPUT_MODE_TEXT; + updateToggleContentDescription(headerToggleButton); + startPickerFragment(); }); } private void updateToggleContentDescription(@NonNull CheckableImageButton toggle) { String contentDescription = - headerToggleButton.isChecked() + inputMode == INPUT_MODE_TEXT ? toggle.getContext().getString(R.string.mtrl_picker_toggle_to_calendar_input_mode) : toggle.getContext().getString(R.string.mtrl_picker_toggle_to_text_input_mode); headerToggleButton.setContentDescription(contentDescription); diff --git a/lib/javatests/com/google/android/material/datepicker/MaterialDatePickerTest.java b/lib/javatests/com/google/android/material/datepicker/MaterialDatePickerTest.java index 08b02700aef..76b91570986 100644 --- a/lib/javatests/com/google/android/material/datepicker/MaterialDatePickerTest.java +++ b/lib/javatests/com/google/android/material/datepicker/MaterialDatePickerTest.java @@ -16,6 +16,7 @@ package com.google.android.material.datepicker; +import static com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_CALENDAR; import static com.google.common.truth.Truth.assertThat; import static java.util.Calendar.APRIL; import static java.util.Calendar.FEBRUARY; @@ -95,7 +96,6 @@ private static void testThisMonthInUtcMillisecondsForLocalTime( @Test public void testSelectionAsOpenAt() { - MaterialDatePicker.Builder datePickerBuilder = MaterialDatePicker.Builder.datePicker(); CalendarConstraints calendarConstraints = new CalendarConstraints.Builder().setStart(FEB_2016).setEnd(APRIL_2016).build(); @@ -178,4 +178,11 @@ public void testFirstDayOfWeekAsDefault() { datePickerBuilder.build(); assertEquals(0, calendarConstraints.getFirstDayOfWeek()); } + + @Test + public void testInputModeCalendarAsDefault() { + MaterialDatePicker materialDatePicker = MaterialDatePicker.Builder.datePicker().build(); + + assertEquals(INPUT_MODE_CALENDAR, materialDatePicker.getInputMode()); + } }