Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ca38559 authored by menghanli's avatar menghanli Committed by Menghan Li
Browse files

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
parent 6fd05aa8
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -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
+31 −3
Original line number Diff line number Diff line
@@ -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