Skip to content

Commit

Permalink
[MaterialDatePicker] Hide the keyboard when switching to calendar mode
Browse files Browse the repository at this point in the history
Resolves #2688
Resolves #2687

GIT_ORIGIN_REV_ID=686526aa049eadb08ded72ca9eb0b60027358756
PiperOrigin-RevId: 447819486
  • Loading branch information
pubiqq authored and leticiarossi committed May 11, 2022
1 parent 14578ed commit 5d6678c
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 15 deletions.
24 changes: 24 additions & 0 deletions lib/java/com/google/android/material/datepicker/DateSelector.java
Expand Up @@ -24,13 +24,15 @@
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;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.StringRes;
import androidx.annotation.StyleRes;
import androidx.core.util.Pair;
import com.google.android.material.internal.ViewUtils;
import java.util.Collection;

/**
Expand Down Expand Up @@ -101,4 +103,26 @@ View onCreateTextInputView(
@Nullable Bundle bundle,
@NonNull CalendarConstraints constraints,
@NonNull OnSelectionChangedListener<S> 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]);
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -232,7 +231,7 @@ void onInvalidDate() {
}
});

ViewUtils.requestFocusAndShowKeyboard(startEditText);
DateSelector.showKeyboardWithAutoHideBehavior(startEditText, endEditText);

return root;
}
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -133,7 +132,7 @@ void onInvalidDate() {
}
});

ViewUtils.requestFocusAndShowKeyboard(dateEditText);
DateSelector.showKeyboardWithAutoHideBehavior(dateEditText);

return root;
}
Expand Down
8 changes: 8 additions & 0 deletions lib/java/com/google/android/material/internal/ViewUtils.java
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 5d6678c

Please sign in to comment.