Merge "Don't crash when recreating ZenModeTimePickerFragment" into main

This commit is contained in:
Matías Hernández
2024-10-07 16:49:20 +00:00
committed by Android (Google) Code Review
3 changed files with 38 additions and 25 deletions

View File

@@ -27,10 +27,10 @@ import android.widget.ToggleButton;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend; import com.android.settingslib.notification.modes.ZenModesBackend;
import com.android.settingslib.widget.LayoutPreference; import com.android.settingslib.widget.LayoutPreference;
@@ -51,11 +51,10 @@ class ZenModeSetSchedulePreferenceController extends AbstractZenModePreferenceCo
private final SimpleDateFormat mShortDayFormat = new SimpleDateFormat("EEEEE"); private final SimpleDateFormat mShortDayFormat = new SimpleDateFormat("EEEEE");
private final SimpleDateFormat mLongDayFormat = new SimpleDateFormat("EEEE"); private final SimpleDateFormat mLongDayFormat = new SimpleDateFormat("EEEE");
private static final String TAG = "ZenModeSetSchedulePreferenceController"; private DashboardFragment mParent;
private Fragment mParent;
private ZenModeConfig.ScheduleInfo mSchedule; private ZenModeConfig.ScheduleInfo mSchedule;
ZenModeSetSchedulePreferenceController(Context context, Fragment parent, String key, ZenModeSetSchedulePreferenceController(Context context, DashboardFragment parent, String key,
ZenModesBackend backend) { ZenModesBackend backend) {
super(context, key, backend); super(context, key, backend);
mParent = parent; mParent = parent;
@@ -154,11 +153,7 @@ class ZenModeSetSchedulePreferenceController extends AbstractZenModePreferenceCo
private View.OnClickListener timePickerLauncher(int hour, int minute, private View.OnClickListener timePickerLauncher(int hour, int minute,
ZenModeTimePickerFragment.TimeSetter timeSetter) { ZenModeTimePickerFragment.TimeSetter timeSetter) {
return v -> { return v -> ZenModeTimePickerFragment.show(mParent, hour, minute, timeSetter);
final ZenModeTimePickerFragment frag = new ZenModeTimePickerFragment(mContext, hour,
minute, timeSetter);
frag.show(mParent.getParentFragmentManager(), TAG);
};
} }
protected static int[] getDaysOfWeekForLocale(Calendar c) { protected static int[] getDaysOfWeekForLocale(Calendar c) {

View File

@@ -16,10 +16,11 @@
package com.android.settings.notification.modes; package com.android.settings.notification.modes;
import static com.google.common.base.Preconditions.checkNotNull;
import android.app.Dialog; import android.app.Dialog;
import android.app.TimePickerDialog; import android.app.TimePickerDialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.widget.TimePicker; import android.widget.TimePicker;
@@ -27,37 +28,54 @@ import android.widget.TimePicker;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment; 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. * 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 public class ZenModeTimePickerFragment extends InstrumentedDialogFragment implements
TimePickerDialog.OnTimeSetListener { 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) { @NonNull TimeSetter timeSetter) {
super(); ZenModeTimePickerFragment fragment = new ZenModeTimePickerFragment();
mContext = context; fragment.mHour = hour;
mHour = hour; fragment.mMinute = minute;
mMinute = minute; fragment.mTimeSetter = timeSetter;
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 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
return new TimePickerDialog(mContext, this, mHour, mMinute, return new TimePickerDialog(getContext(), this, mHour, mMinute,
DateFormat.is24HourFormat(mContext)); DateFormat.is24HourFormat(getContext()));
} }
/** /**
* Calls the provided TimeSetter's setTime() method when a time is set on the TimePicker. * 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) { public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
mTimeSetter.setTime(hourOfDay, minute); checkNotNull(mTimeSetter).setTime(hourOfDay, minute);
} }
@Override @Override

View File

@@ -32,10 +32,10 @@ import android.service.notification.ZenModeConfig;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ToggleButton; import android.widget.ToggleButton;
import androidx.fragment.app.Fragment;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.notification.modes.TestModeBuilder; import com.android.settingslib.notification.modes.TestModeBuilder;
import com.android.settingslib.notification.modes.ZenMode; import com.android.settingslib.notification.modes.ZenMode;
import com.android.settingslib.notification.modes.ZenModesBackend; import com.android.settingslib.notification.modes.ZenModesBackend;
@@ -60,7 +60,7 @@ public class ZenModeSetSchedulePreferenceControllerTest {
private Context mContext; private Context mContext;
@Mock @Mock
private Fragment mParent; private DashboardFragment mParent;
@Mock @Mock
private Calendar mCalendar; private Calendar mCalendar;
@Mock @Mock