diff --git a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java b/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java index 429fd9deca9..9681a42ad0a 100644 --- a/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java +++ b/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceController.java @@ -28,12 +28,13 @@ import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.PrimarySwitchPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnCreate; +import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState; /** PrimarySwitchPreferenceController that shows quick settings tooltip on first use. */ public abstract class AccessibilityQuickSettingsPrimarySwitchPreferenceController extends TogglePreferenceController - implements LifecycleObserver, OnCreate, OnSaveInstanceState { + implements LifecycleObserver, OnCreate, OnDestroy, OnSaveInstanceState { private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow"; private final Handler mHandler; private PrimarySwitchPreference mPreference; @@ -62,10 +63,16 @@ public abstract class AccessibilityQuickSettingsPrimarySwitchPreferenceControlle } } + @Override + public void onDestroy() { + mHandler.removeCallbacksAndMessages(null); + } + @Override public void onSaveInstanceState(Bundle outState) { - if (mTooltipWindow != null) { - outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, mTooltipWindow.isShowing()); + final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing(); + if (mNeedsQSTooltipReshow || isTooltipWindowShowing) { + outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); } } diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java index 5546ba665a3..17334b1239e 100644 --- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java +++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java @@ -20,6 +20,7 @@ import static com.android.settings.accessibility.AccessibilityDialogUtils.Dialog import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_GENERAL_CATEGORY; import static com.android.settings.accessibility.ToggleFeaturePreferenceFragment.KEY_SAVED_QS_TOOLTIP_TYPE; +import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.ComponentName; @@ -150,7 +151,12 @@ public abstract class AccessibilityShortcutPreferenceFragment extends DashboardF // Reshow tooltip when activity recreate, such as rotate device. if (mNeedsQSTooltipReshow) { - getView().post(this::showQuickSettingsTooltipIfNeeded); + view.post(() -> { + final Activity activity = getActivity(); + if (activity != null && !activity.isFinishing()) { + showQuickSettingsTooltipIfNeeded(); + } + }); } } @@ -180,8 +186,9 @@ public abstract class AccessibilityShortcutPreferenceFragment extends DashboardF if (value != NOT_SET) { outState.putInt(KEY_SAVED_USER_SHORTCUT_TYPE, value); } - if (mTooltipWindow != null) { - outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, mTooltipWindow.isShowing()); + final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing(); + if (mNeedsQSTooltipReshow || isTooltipWindowShowing) { + outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); outState.putInt(KEY_SAVED_QS_TOOLTIP_TYPE, mNeedsQSTooltipType); } super.onSaveInstanceState(outState); diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index e3b9e930f33..17b178a79c8 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -18,6 +18,7 @@ package com.android.settings.accessibility; import static com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; +import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.ComponentName; @@ -232,13 +233,18 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - final SettingsActivity activity = (SettingsActivity) getActivity(); - final SettingsMainSwitchBar switchBar = activity.getSwitchBar(); + final SettingsActivity settingsActivity = (SettingsActivity) getActivity(); + final SettingsMainSwitchBar switchBar = settingsActivity.getSwitchBar(); switchBar.hide(); // Reshow tooltip when activity recreate, such as rotate device. if (mNeedsQSTooltipReshow) { - getView().post(this::showQuickSettingsTooltipIfNeeded); + view.post(() -> { + final Activity activity = getActivity(); + if (activity != null && !activity.isFinishing()) { + showQuickSettingsTooltipIfNeeded(); + } + }); } writeDefaultShortcutTargetServiceToSettingsIfNeeded(getPrefContext()); @@ -275,8 +281,9 @@ public abstract class ToggleFeaturePreferenceFragment extends DashboardFragment if (value != NOT_SET) { outState.putInt(KEY_SAVED_USER_SHORTCUT_TYPE, value); } - if (mTooltipWindow != null) { - outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, mTooltipWindow.isShowing()); + final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing(); + if (mNeedsQSTooltipReshow || isTooltipWindowShowing) { + outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); outState.putInt(KEY_SAVED_QS_TOOLTIP_TYPE, mNeedsQSTooltipType); } super.onSaveInstanceState(outState); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java index deab7453337..47c83703514 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest.java @@ -153,12 +153,10 @@ public class AccessibilityQuickSettingsPrimarySwitchPreferenceControllerTest { @Test @Config(shadows = ShadowFragment.class) public void restoreValueFromSavedInstanceState_showTooltipView() { - mController.displayPreference(mScreen); - mController.setChecked(true); final Bundle savedInstanceState = new Bundle(); savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true); + mController.onCreate(savedInstanceState); - mFragment.onCreate(savedInstanceState); mController.displayPreference(mScreen); assertThat(getLatestPopupWindow().isShowing()).isTrue();