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

Commit 9e207bfc authored by Arc Wang's avatar Arc Wang
Browse files

[Activity embedding] Fix unexpected finished 2nd layer problem

If Settings is started on an existing task, the existing SplitPairRule
may cause an unexpected app finish while navigating back from the
2nd layer page.

This change resets SplitPairRule in onNewIntent().

Bug: 247080168
Test: make RunSettingsRoboTests ROBOTEST_FILTER=SettingsHomepageActivityTest
      manual
      1. Settings app -> 'Connexted device'.
      2. Launch Settings app again from Settings icon in quick Settings.
      3. Start a 3rd layer from 'Network & internet'
      4. Click back and see if the 2nd lay shows.
Change-Id: I262327cc49c3a4434a183eb00ac57f47fa598f70
Merged-In: I262327cc49c3a4434a183eb00ac57f47fa598f70
parent b0f38d29
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toolbar;

import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowCompat;
@@ -242,10 +243,21 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        if (isFinishing()) {
            return;
        }

        if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)
                && (intent.getFlags() & Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
            initSplitPairRules();
        }

        // Launch the intent from deep link for large screen devices.
        launchDeepLinkIntentToRight();
    }

    @VisibleForTesting
    void initSplitPairRules() {
        new ActivityEmbeddingRulesController(getApplicationContext()).initRules();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
@@ -502,7 +514,8 @@ public class SettingsHomepageActivity extends FragmentActivity implements
        return menuKey;
    }

    private void reloadHighlightMenuKey() {
    @VisibleForTesting
    void reloadHighlightMenuKey() {
        mMainFragment.getArguments().putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY,
                getHighlightMenuKey());
        mMainFragment.reloadHighlightMenuKey();
+20 −0
Original line number Diff line number Diff line
@@ -20,12 +20,15 @@ import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTE

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.app.ActivityManager;
import android.content.Intent;
import android.os.Build;
import android.view.View;
import android.view.Window;
@@ -37,6 +40,7 @@ import androidx.fragment.app.Fragment;
import com.android.settings.R;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl;
import com.android.settings.homepage.contextualcards.slices.BatteryFixSliceTest;
import com.android.settings.testutils.shadow.ShadowActivityEmbeddingUtils;
import com.android.settings.testutils.shadow.ShadowUserManager;
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;

@@ -195,6 +199,22 @@ public class SettingsHomepageActivityTest {
                & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS).isEqualTo(0);
    }

    /** This test is for large screen devices Activity embedding. */
    @Test
    @Config(shadows = ShadowActivityEmbeddingUtils.class)
    public void onNewIntent_flagClearTop_shouldInitRules() {
        ShadowActivityEmbeddingUtils.setIsEmbeddingActivityEnabled(true);
        SettingsHomepageActivity activity =
                spy(Robolectric.buildActivity(SettingsHomepageActivity.class).get());
        doNothing().when(activity).reloadHighlightMenuKey();
        TopLevelSettings topLevelSettings = mock(TopLevelSettings.class);
        doReturn(topLevelSettings).when(activity).getMainFragment();

        activity.onNewIntent(new Intent().setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

        verify(activity).initSplitPairRules();
    }

    @Implements(SuggestionFeatureProviderImpl.class)
    public static class ShadowSuggestionFeatureProviderImpl {