Fix windows leaked in ZenModeScheduleRuleSettings
ZenModeScheduleRuleSettings creates an DaysDialog when user clicked Days option. If Activity was destroyed suddenly, WindowsManager throws a windows leaked exception. And then DaysDialog try to do something(dismiss), settings app will crash. So, we need to dismiss dialog when activity was destroyed. Test: robo test, change code to recover symptom, manual test Change-Id: I8d5370fe9673573581d613da91c7ab9be55d8199 Fixes: 111841375
This commit is contained in:
@@ -63,6 +63,7 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
|
|||||||
private TimePickerPreference mStart;
|
private TimePickerPreference mStart;
|
||||||
private TimePickerPreference mEnd;
|
private TimePickerPreference mEnd;
|
||||||
private SwitchPreference mExitAtAlarm;
|
private SwitchPreference mExitAtAlarm;
|
||||||
|
private AlertDialog mDayDialog;
|
||||||
|
|
||||||
private ScheduleInfo mSchedule;
|
private ScheduleInfo mSchedule;
|
||||||
|
|
||||||
@@ -195,7 +196,6 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
|
|||||||
updateEndSummary();
|
updateEndSummary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
|
||||||
List<AbstractPreferenceController> controllers = new ArrayList<>();
|
List<AbstractPreferenceController> controllers = new ArrayList<>();
|
||||||
@@ -214,18 +214,27 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
|
|||||||
return MetricsEvent.NOTIFICATION_ZEN_MODE_SCHEDULE_RULE;
|
return MetricsEvent.NOTIFICATION_ZEN_MODE_SCHEDULE_RULE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (mDayDialog != null && mDayDialog.isShowing()) {
|
||||||
|
mDayDialog.dismiss();
|
||||||
|
mDayDialog = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void showDaysDialog() {
|
private void showDaysDialog() {
|
||||||
new AlertDialog.Builder(mContext)
|
mDayDialog = new AlertDialog.Builder(mContext)
|
||||||
.setTitle(R.string.zen_mode_schedule_rule_days)
|
.setTitle(R.string.zen_mode_schedule_rule_days)
|
||||||
.setView(new ZenModeScheduleDaysSelection(mContext, mSchedule.days) {
|
.setView(new ZenModeScheduleDaysSelection(mContext, mSchedule.days) {
|
||||||
@Override
|
@Override
|
||||||
protected void onChanged(final int[] days) {
|
protected void onChanged(final int[] days) {
|
||||||
if (mDisableListeners) return;
|
if (mDisableListeners) return;
|
||||||
if (Arrays.equals(days, mSchedule.days)) return;
|
if (Arrays.equals(days, mSchedule.days)) return;
|
||||||
if (DEBUG) Log.d(TAG, "days.onChanged days=" + Arrays.asList(days));
|
if (DEBUG) Log.d(TAG, "days.onChanged days=" + Arrays.asList(days));
|
||||||
mSchedule.days = days;
|
mSchedule.days = days;
|
||||||
updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
|
updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.setOnDismissListener(new OnDismissListener() {
|
.setOnDismissListener(new OnDismissListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -249,7 +258,7 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
|
|||||||
super(context);
|
super(context);
|
||||||
mContext = context;
|
mContext = context;
|
||||||
setPersistent(false);
|
setPersistent(false);
|
||||||
setOnPreferenceClickListener(new OnPreferenceClickListener(){
|
setOnPreferenceClickListener(new OnPreferenceClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceClick(Preference preference) {
|
public boolean onPreferenceClick(Preference preference) {
|
||||||
final TimePickerFragment frag = new TimePickerFragment();
|
final TimePickerFragment frag = new TimePickerFragment();
|
||||||
|
Reference in New Issue
Block a user