From 057c5dc8ed78d139613eb182b034872edaf37708 Mon Sep 17 00:00:00 2001 From: menghanli Date: Fri, 19 Aug 2022 11:08:13 +0800 Subject: [PATCH] Fix no show quick settings tutorial after device rotates Root cause: Render apps below the cutout area to make the fragment recreate multiple times when the device rotates. The tutorial status is not stored correctly and try to show the tutorial when activity is finishing. Solution: Avoid showing the tutorial when the activity is finishing and store correct tutorial status after recreate. Bug: 239578655 Test: Manual testing Change-Id: I3ff12e23eb971f61280ebc89014b086dc348d734 --- ...ttingsPrimarySwitchPreferenceController.java | 13 ++++++++++--- ...AccessibilityShortcutPreferenceFragment.java | 13 ++++++++++--- .../ToggleFeaturePreferenceFragment.java | 17 ++++++++++++----- ...gsPrimarySwitchPreferenceControllerTest.java | 4 +--- 4 files changed, 33 insertions(+), 14 deletions(-) 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();