OSDN Git Service

Fix windows leaked in ZenModeScheduleRuleSettings
authortmfang <tmfang@google.com>
Tue, 31 Jul 2018 08:24:57 +0000 (16:24 +0800)
committertmfang <tmfang@google.com>
Tue, 31 Jul 2018 08:45:07 +0000 (16:45 +0800)
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

src/com/android/settings/notification/ZenModeScheduleRuleSettings.java

index 3cfd13d..1769871 100644 (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();