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:
tmfang
2018-07-31 16:24:57 +08:00
parent 89d35f949c
commit 4b5cbca5c8

View File

@@ -63,6 +63,7 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
private TimePickerPreference mStart;
private TimePickerPreference mEnd;
private SwitchPreference mExitAtAlarm;
private AlertDialog mDayDialog;
private ScheduleInfo mSchedule;
@@ -195,7 +196,6 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
updateEndSummary();
}
@Override
protected List<AbstractPreferenceController> createPreferenceControllers(Context context) {
List<AbstractPreferenceController> controllers = new ArrayList<>();
@@ -214,18 +214,27 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
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() {
new AlertDialog.Builder(mContext)
mDayDialog = new AlertDialog.Builder(mContext)
.setTitle(R.string.zen_mode_schedule_rule_days)
.setView(new ZenModeScheduleDaysSelection(mContext, mSchedule.days) {
@Override
protected void onChanged(final int[] days) {
if (mDisableListeners) return;
if (Arrays.equals(days, mSchedule.days)) return;
if (DEBUG) Log.d(TAG, "days.onChanged days=" + Arrays.asList(days));
mSchedule.days = days;
updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
}
@Override
protected void onChanged(final int[] days) {
if (mDisableListeners) return;
if (Arrays.equals(days, mSchedule.days)) return;
if (DEBUG) Log.d(TAG, "days.onChanged days=" + Arrays.asList(days));
mSchedule.days = days;
updateRule(ZenModeConfig.toScheduleConditionId(mSchedule));
}
})
.setOnDismissListener(new OnDismissListener() {
@Override
@@ -249,7 +258,7 @@ public class ZenModeScheduleRuleSettings extends ZenModeRuleSettingsBase {
super(context);
mContext = context;
setPersistent(false);
setOnPreferenceClickListener(new OnPreferenceClickListener(){
setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
final TimePickerFragment frag = new TimePickerFragment();