From 1dc0e6b4909958d50522a6e9cb70ecdcd42ec384 Mon Sep 17 00:00:00 2001 From: pubiqq Date: Wed, 29 Jun 2022 11:51:05 -0700 Subject: [PATCH] [MaterialTimePicker] Fix AM/PM toggle Before the CL we set AM/PM selection in the listeners no matter the target view (AM/PM) is being checked or being unchecked. So the order of calling listeners of AM and PM can "revert" the selection, if the callback for being unchecked is called later. This logic is apparently wrong - we should select AM/PM when they are being unchecked anyways. Resolves https://github.com/material-components/material-components-android/pull/2791 Resolves https://github.com/material-components/material-components-android/issues/2788 GIT_ORIGIN_REV_ID=018e053394f44d6334827fc3f95406c2937ae582 PiperOrigin-RevId: 458027987 --- .../TimePickerTextInputPresenter.java | 19 ++++++++------- .../material/timepicker/TimePickerView.java | 23 +++++++++---------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java b/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java index 8ed7f490169..071399e009e 100644 --- a/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java +++ b/lib/java/com/google/android/material/timepicker/TimePickerTextInputPresenter.java @@ -43,7 +43,6 @@ import androidx.annotation.ColorInt; import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; import com.google.android.material.button.MaterialButtonToggleGroup; -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; @@ -194,15 +193,15 @@ private void setTime(TimeModel time) { private void setupPeriodToggle() { toggle = timePickerView.findViewById(R.id.material_clock_period_toggle); - toggle.addOnButtonCheckedListener( - new OnButtonCheckedListener() { - @Override - public void onButtonChecked( - MaterialButtonToggleGroup group, int checkedId, boolean isChecked) { - int period = checkedId == R.id.material_clock_period_pm_button ? PM : AM; - time.setPeriod(period); - } - }); + toggle.addOnButtonCheckedListener((group, checkedId, isChecked) -> { + if (!isChecked) { + return; + } + + int period = checkedId == R.id.material_clock_period_pm_button ? PM : AM; + time.setPeriod(period); + }); + toggle.setVisibility(View.VISIBLE); updateSelection(); } diff --git a/lib/java/com/google/android/material/timepicker/TimePickerView.java b/lib/java/com/google/android/material/timepicker/TimePickerView.java index e776e0871b5..e4ad8eb66e6 100644 --- a/lib/java/com/google/android/material/timepicker/TimePickerView.java +++ b/lib/java/com/google/android/material/timepicker/TimePickerView.java @@ -41,7 +41,6 @@ import androidx.core.view.AccessibilityDelegateCompat; import androidx.core.view.ViewCompat; import com.google.android.material.button.MaterialButtonToggleGroup; -import com.google.android.material.button.MaterialButtonToggleGroup.OnButtonCheckedListener; import com.google.android.material.chip.Chip; import com.google.android.material.timepicker.ClockHandView.OnActionUpListener; import com.google.android.material.timepicker.ClockHandView.OnRotateListener; @@ -103,17 +102,17 @@ public TimePickerView(Context context, @Nullable AttributeSet attrs, int defStyl LayoutInflater.from(context).inflate(R.layout.material_timepicker, this); clockFace = findViewById(R.id.material_clock_face); toggle = findViewById(R.id.material_clock_period_toggle); - toggle.addOnButtonCheckedListener( - new OnButtonCheckedListener() { - @Override - public void onButtonChecked( - MaterialButtonToggleGroup group, int checkedId, boolean isChecked) { - int period = checkedId == R.id.material_clock_period_pm_button ? PM : AM; - if (onPeriodChangeListener != null && isChecked) { - onPeriodChangeListener.onPeriodChange(period); - } - } - }); + + toggle.addOnButtonCheckedListener((group, checkedId, isChecked) -> { + if (!isChecked) { + return; + } + + int period = checkedId == R.id.material_clock_period_pm_button ? PM : AM; + if (onPeriodChangeListener != null) { + onPeriodChangeListener.onPeriodChange(period); + } + }); minuteView = findViewById(R.id.material_minute_tv); hourView = findViewById(R.id.material_hour_tv);