From: tmfang Date: Tue, 31 Jul 2018 08:24:57 +0000 (+0800) Subject: Fix windows leaked in ZenModeScheduleRuleSettings X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4b5cbca5c855b591b68e8bb36c04e75d85d330b8;p=android-x86%2Fpackages-apps-Settings.git 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 --- diff --git a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java index 3cfd13d154..1769871fa1 100644 --- a/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java +++ b/src/com/android/settings/notification/ZenModeScheduleRuleSettings.java @@ -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 createPreferenceControllers(Context context) { List 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();