From e5720f43ee152abb3a229312d508555f320c3db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Fri, 4 Oct 2024 18:58:53 +0200 Subject: [PATCH] Don't crash when recreating ZenModeTimePickerFragment Instead, just bail out. Fixes: 369814629 Test: manual, with don't keep activities Flag: android.app.modes_ui Change-Id: I893b6363801b3a56bc29999dd801d7c8152cb5e8 --- ...enModeSetSchedulePreferenceController.java | 13 ++---- .../modes/ZenModeTimePickerFragment.java | 46 +++++++++++++------ ...deSetSchedulePreferenceControllerTest.java | 4 +- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java b/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java index d6b2f0117b9..651b7cc035e 100644 --- a/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java +++ b/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java @@ -27,10 +27,10 @@ import android.widget.ToggleButton; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import androidx.fragment.app.Fragment; import androidx.preference.Preference; import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenModesBackend; import com.android.settingslib.widget.LayoutPreference; @@ -51,11 +51,10 @@ class ZenModeSetSchedulePreferenceController extends AbstractZenModePreferenceCo private final SimpleDateFormat mShortDayFormat = new SimpleDateFormat("EEEEE"); private final SimpleDateFormat mLongDayFormat = new SimpleDateFormat("EEEE"); - private static final String TAG = "ZenModeSetSchedulePreferenceController"; - private Fragment mParent; + private DashboardFragment mParent; private ZenModeConfig.ScheduleInfo mSchedule; - ZenModeSetSchedulePreferenceController(Context context, Fragment parent, String key, + ZenModeSetSchedulePreferenceController(Context context, DashboardFragment parent, String key, ZenModesBackend backend) { super(context, key, backend); mParent = parent; @@ -154,11 +153,7 @@ class ZenModeSetSchedulePreferenceController extends AbstractZenModePreferenceCo private View.OnClickListener timePickerLauncher(int hour, int minute, ZenModeTimePickerFragment.TimeSetter timeSetter) { - return v -> { - final ZenModeTimePickerFragment frag = new ZenModeTimePickerFragment(mContext, hour, - minute, timeSetter); - frag.show(mParent.getParentFragmentManager(), TAG); - }; + return v -> ZenModeTimePickerFragment.show(mParent, hour, minute, timeSetter); } protected static int[] getDaysOfWeekForLocale(Calendar c) { diff --git a/src/com/android/settings/notification/modes/ZenModeTimePickerFragment.java b/src/com/android/settings/notification/modes/ZenModeTimePickerFragment.java index 3fa53946477..4594e5cbc9c 100644 --- a/src/com/android/settings/notification/modes/ZenModeTimePickerFragment.java +++ b/src/com/android/settings/notification/modes/ZenModeTimePickerFragment.java @@ -16,10 +16,11 @@ package com.android.settings.notification.modes; +import static com.google.common.base.Preconditions.checkNotNull; + import android.app.Dialog; import android.app.TimePickerDialog; import android.app.settings.SettingsEnums; -import android.content.Context; import android.os.Bundle; import android.text.format.DateFormat; import android.widget.TimePicker; @@ -27,37 +28,54 @@ import android.widget.TimePicker; import androidx.annotation.NonNull; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.dashboard.DashboardFragment; /** * Dialog that shows when a user selects a (start or end) time to edit for a schedule-based mode. */ public class ZenModeTimePickerFragment extends InstrumentedDialogFragment implements TimePickerDialog.OnTimeSetListener { - private final Context mContext; - private final TimeSetter mTimeSetter; - private final int mHour; - private final int mMinute; - public ZenModeTimePickerFragment(Context context, int hour, int minute, + private static final String TAG = "ZenModeTimePickerFragment"; + + private TimeSetter mTimeSetter; + private int mHour; + private int mMinute; + + public static void show(DashboardFragment parent, int hour, int minute, @NonNull TimeSetter timeSetter) { - super(); - mContext = context; - mHour = hour; - mMinute = minute; - mTimeSetter = timeSetter; + ZenModeTimePickerFragment fragment = new ZenModeTimePickerFragment(); + fragment.mHour = hour; + fragment.mMinute = minute; + fragment.mTimeSetter = timeSetter; + + fragment.show(parent.getParentFragmentManager(), TAG); } + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (mTimeSetter == null) { + // Probably the dialog fragment was recreated after its activity was destroyed. + // It's pointless to re-show the dialog if we can't do anything when its options are + // selected, so we don't. + dismiss(); + } + } + + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { - return new TimePickerDialog(mContext, this, mHour, mMinute, - DateFormat.is24HourFormat(mContext)); + return new TimePickerDialog(getContext(), this, mHour, mMinute, + DateFormat.is24HourFormat(getContext())); } /** * Calls the provided TimeSetter's setTime() method when a time is set on the TimePicker. */ + @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { - mTimeSetter.setTime(hourOfDay, minute); + checkNotNull(mTimeSetter).setTime(hourOfDay, minute); } @Override diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java index d5c7f61034e..c378e9de427 100644 --- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java @@ -32,10 +32,10 @@ import android.service.notification.ZenModeConfig; import android.view.ViewGroup; import android.widget.ToggleButton; -import androidx.fragment.app.Fragment; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; +import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.notification.modes.TestModeBuilder; import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenModesBackend; @@ -60,7 +60,7 @@ public class ZenModeSetSchedulePreferenceControllerTest { private Context mContext; @Mock - private Fragment mParent; + private DashboardFragment mParent; @Mock private Calendar mCalendar; @Mock