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
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