From 1ca385591a76981752e1a47db92b260e9e5337b1 Mon Sep 17 00:00:00 2001 From: menghanli Date: Tue, 9 Aug 2022 09:52:01 +0800 Subject: [PATCH] Fix IllegalStateException to get tile content after device rotate Root cause: Race condition to get content after the onDetach() Solution: Add protection to prevent this IllegalStateException Bug: 239578655 Test: make RunSettingsRoboTests ROBOTEST_FILTER=OneHandedSettings Test: Manual testing by rotating 100 times quickly Change-Id: I0a03cf1c01cd34c8ae0b0e70c4ffc41168b18ab8 --- .../settings/gestures/OneHandedSettings.java | 14 ++++++-- .../gestures/OneHandedSettingsTest.java | 34 +++++++++++++++++-- 2 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/gestures/OneHandedSettings.java b/src/com/android/settings/gestures/OneHandedSettings.java index e1b9b817f95..aa193865886 100644 --- a/src/com/android/settings/gestures/OneHandedSettings.java +++ b/src/com/android/settings/gestures/OneHandedSettings.java @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.Context; import android.os.Bundle; import android.os.UserHandle; +import android.util.Log; import com.android.internal.accessibility.AccessibilityShortcutController; import com.android.settings.R; @@ -39,6 +40,7 @@ import com.android.settingslib.widget.MainSwitchPreference; */ public class OneHandedSettings extends AccessibilityShortcutPreferenceFragment { + private static final String TAG = "OneHandedSettings"; private static final String ONE_HANDED_SHORTCUT_KEY = "one_handed_shortcuts_preference"; private static final String ONE_HANDED_ILLUSTRATION_KEY = "one_handed_header"; protected static final String ONE_HANDED_MAIN_SWITCH_KEY = @@ -131,9 +133,15 @@ public class OneHandedSettings extends AccessibilityShortcutPreferenceFragment { @Override protected CharSequence getTileTooltipContent(@QuickSettingsTooltipType int type) { + final Context context = getContext(); + if (context == null) { + Log.w(TAG, "OneHandedSettings not attached to a context."); + return null; + } return type == QuickSettingsTooltipType.GUIDE_TO_EDIT - ? getText(R.string.accessibility_one_handed_mode_qs_tooltip_content) - : getText(R.string.accessibility_one_handed_mode_auto_added_qs_tooltip_content); + ? context.getText(R.string.accessibility_one_handed_mode_qs_tooltip_content) + : context.getText( + R.string.accessibility_one_handed_mode_auto_added_qs_tooltip_content); } @Override @@ -143,7 +151,7 @@ public class OneHandedSettings extends AccessibilityShortcutPreferenceFragment { @Override protected String getLogTag() { - return null; + return TAG; } @Override diff --git a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsTest.java b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsTest.java index 26517089a66..9633b15bec4 100644 --- a/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsTest.java +++ b/tests/robotests/src/com/android/settings/gestures/OneHandedSettingsTest.java @@ -18,10 +18,18 @@ package com.android.settings.gestures; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + import android.content.Context; import android.os.SystemProperties; import android.provider.SearchIndexableResource; +import androidx.test.core.app.ApplicationProvider; + +import com.android.settings.R; +import com.android.settings.accessibility.AccessibilityUtil.QuickSettingsTooltipType; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -31,16 +39,36 @@ import org.robolectric.util.ReflectionHelpers; import java.util.List; +/** Tests for {@link OneHandedSettings}. */ @RunWith(RobolectricTestRunner.class) public class OneHandedSettingsTest { + private final Context mContext = ApplicationProvider.getApplicationContext(); private OneHandedSettings mSettings; - private Context mContext; @Before public void setUp() { - mSettings = new OneHandedSettings(); - mContext = RuntimeEnvironment.application; + mSettings = spy(new OneHandedSettings()); + } + + @Test + public void getTileTooltipContent_returnsExpectedValues() { + // Simulate to call getTileTooltipContent after onDetach + assertThat(mSettings.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT)) + .isNull(); + // Simulate to call getTileTooltipContent after onAttach + when(mSettings.getContext()).thenReturn(mContext); + assertThat(mSettings.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_EDIT)) + .isEqualTo(mContext.getText( + R.string.accessibility_one_handed_mode_qs_tooltip_content)); + assertThat(mSettings.getTileTooltipContent(QuickSettingsTooltipType.GUIDE_TO_DIRECT_USE)) + .isEqualTo(mContext.getText( + R.string.accessibility_one_handed_mode_auto_added_qs_tooltip_content)); + } + + @Test + public void getLogTag_returnsCorrectTag() { + assertThat(mSettings.getLogTag()).isEqualTo("OneHandedSettings"); } @Test