From 5d6678cc66e64c379818bc294a3db4a19e1005a4 Mon Sep 17 00:00:00 2001 From: pubiqq Date: Tue, 10 May 2022 16:51:25 -0400 Subject: [PATCH] [MaterialDatePicker] Hide the keyboard when switching to calendar mode Resolves https://github.com/material-components/material-components-android/pull/2688 Resolves https://github.com/material-components/material-components-android/issues/2687 GIT_ORIGIN_REV_ID=686526aa049eadb08ded72ca9eb0b60027358756 PiperOrigin-RevId: 447819486 --- .../material/datepicker/DateSelector.java | 24 +++++++++++++++++++ .../datepicker/RangeDateSelector.java | 3 +-- .../datepicker/SingleDateSelector.java | 3 +-- .../android/material/internal/ViewUtils.java | 8 +++++++ .../TimePickerTextInputPresenter.java | 15 ++++-------- 5 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/java/com/google/android/material/datepicker/DateSelector.java b/lib/java/com/google/android/material/datepicker/DateSelector.java index c73c071ea48..caec7a9f3cc 100644 --- a/lib/java/com/google/android/material/datepicker/DateSelector.java +++ b/lib/java/com/google/android/material/datepicker/DateSelector.java @@ -24,6 +24,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.EditText; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.RestrictTo; @@ -31,6 +32,7 @@ import androidx.annotation.StringRes; import androidx.annotation.StyleRes; import androidx.core.util.Pair; +import com.google.android.material.internal.ViewUtils; import java.util.Collection; /** @@ -101,4 +103,26 @@ View onCreateTextInputView( @Nullable Bundle bundle, @NonNull CalendarConstraints constraints, @NonNull OnSelectionChangedListener listener); + + static void showKeyboardWithAutoHideBehavior(@NonNull EditText... editTexts) { + if (editTexts.length == 0) { + return; + } + + View.OnFocusChangeListener listener = + (view, hasFocus) -> { + for (EditText editText : editTexts) { + if (editText.hasFocus()) { + return; + } + } + ViewUtils.hideKeyboard(view); + }; + + for (EditText editText : editTexts) { + editText.setOnFocusChangeListener(listener); + } + + ViewUtils.requestFocusAndShowKeyboard(editTexts[0]); + } } diff --git a/lib/java/com/google/android/material/datepicker/RangeDateSelector.java b/lib/java/com/google/android/material/datepicker/RangeDateSelector.java index ef7294b5e99..119e007a13c 100644 --- a/lib/java/com/google/android/material/datepicker/RangeDateSelector.java +++ b/lib/java/com/google/android/material/datepicker/RangeDateSelector.java @@ -35,7 +35,6 @@ import androidx.core.util.Pair; import androidx.core.util.Preconditions; import com.google.android.material.internal.ManufacturerUtils; -import com.google.android.material.internal.ViewUtils; import com.google.android.material.resources.MaterialAttributes; import com.google.android.material.textfield.TextInputLayout; import java.text.SimpleDateFormat; @@ -232,7 +231,7 @@ void onInvalidDate() { } }); - ViewUtils.requestFocusAndShowKeyboard(startEditText); + DateSelector.showKeyboardWithAutoHideBehavior(startEditText, endEditText); return root; } diff --git a/lib/java/com/google/android/material/datepicker/SingleDateSelector.java b/lib/java/com/google/android/material/datepicker/SingleDateSelector.java index 7a87ea49be4..d96bc91ee0a 100644 --- a/lib/java/com/google/android/material/datepicker/SingleDateSelector.java +++ b/lib/java/com/google/android/material/datepicker/SingleDateSelector.java @@ -33,7 +33,6 @@ import androidx.annotation.RestrictTo.Scope; import androidx.core.util.Pair; import com.google.android.material.internal.ManufacturerUtils; -import com.google.android.material.internal.ViewUtils; import com.google.android.material.resources.MaterialAttributes; import com.google.android.material.textfield.TextInputLayout; import java.text.SimpleDateFormat; @@ -133,7 +132,7 @@ void onInvalidDate() { } }); - ViewUtils.requestFocusAndShowKeyboard(dateEditText); + DateSelector.showKeyboardWithAutoHideBehavior(dateEditText); return root; } diff --git a/lib/java/com/google/android/material/internal/ViewUtils.java b/lib/java/com/google/android/material/internal/ViewUtils.java index 8cdbd720596..ece44abe913 100644 --- a/lib/java/com/google/android/material/internal/ViewUtils.java +++ b/lib/java/com/google/android/material/internal/ViewUtils.java @@ -19,6 +19,7 @@ import com.google.android.material.R; import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP; +import static androidx.core.content.ContextCompat.getSystemService; import android.content.Context; import android.content.res.Resources; @@ -97,6 +98,13 @@ public void run() { }); } + public static void hideKeyboard(@NonNull final View view) { + InputMethodManager imm = getSystemService(view.getContext(), InputMethodManager.class); + if (imm != null) { + imm.hideSoftInputFromWindow(view.getWindowToken(), 0); + } + } + /** * Wrapper around {@link androidx.core.view.OnApplyWindowInsetsListener} which also passes the * initial padding set on the view. Used with {@link #doOnApplyWindowInsets(View, diff --git a/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java b/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java index ae9df1e2cbc..8ed7f490169 100644 --- a/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java +++ b/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java @@ -19,7 +19,6 @@ import com.google.android.material.R; import static android.view.View.GONE; -import static androidx.core.content.ContextCompat.getSystemService; import static com.google.android.material.timepicker.TimeFormat.CLOCK_12H; import static java.util.Calendar.AM; import static java.util.Calendar.HOUR; @@ -38,7 +37,6 @@ import android.text.TextWatcher; import android.view.View; import android.view.View.OnClickListener; -import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; @@ -48,6 +46,7 @@ import com.google.android.material.button.MaterialButtonToggleGroup.OnButtonCheckedListener; import com.google.android.material.color.MaterialColors; import com.google.android.material.internal.TextWatcherAdapter; +import com.google.android.material.internal.ViewUtils; import com.google.android.material.timepicker.TimePickerView.OnSelectionChange; import java.lang.reflect.Field; import java.util.Locale; @@ -236,16 +235,10 @@ public void show() { @Override public void hide() { View currentFocus = timePickerView.getFocusedChild(); - // Hide keyboard in case it was showing. - if (currentFocus == null) { - timePickerView.setVisibility(GONE); - return; - } - Context context = timePickerView.getContext(); - InputMethodManager imm = getSystemService(context, InputMethodManager.class); - if (imm != null) { - imm.hideSoftInputFromWindow(currentFocus.getWindowToken(), 0); + if (currentFocus != null) { + ViewUtils.hideKeyboard(currentFocus); } + timePickerView.setVisibility(GONE); }