Merge "Don't crash when recreating ZenModeTimePickerFragment" into main
diff --git a/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java b/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java
index d6b2f01..651b7cc 100644
--- a/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java
+++ b/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceController.java
@@ -27,10 +27,10 @@
 
 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 @@
     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 @@
 
     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 3fa5394..4594e5c 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 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 d5c7f61..c378e9d 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.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 @@
     private Context mContext;
 
     @Mock
-    private Fragment mParent;
+    private DashboardFragment mParent;
     @Mock
     private Calendar mCalendar;
     @Mock