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

Commit b70b36d8 authored by Riddle Hsu's avatar Riddle Hsu
Browse files

Check preferred display for matching existing activity

Fix two conditions:
- If the reused activity is in the top focused stack, it is unable
  to reparent to preferred display because top task is the same as
  reused task.
- If the reused activity is in preferred display, it is unnecessary
  to get launch stack that may produce a dangling stack.

Also make TestActivityDisplay support real multiple display.
Originally it gets display from DisplayManager which restricts
to use default display only.

Bug: b/115277654
Test: atest FrameworksServicesTests:ActivityStarterTests# \
      testDeliverIntentToTopActivityOfNonTopDisplay
Test: atest FrameworksServicesTests:ActivityStarterTests# \
      testReparentTopFocusedActivityToSecondaryDisplay

Change-Id: Id24c235a8a4ffab2917d46fc287413f9bf28c58d
parent 3bbff814
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -126,11 +126,6 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>

    private final FindTaskResult mTmpFindTaskResult = new FindTaskResult();

    @VisibleForTesting
    ActivityDisplay(ActivityStackSupervisor supervisor, int displayId) {
        this(supervisor, supervisor.mDisplayManager.getDisplay(displayId));
    }

    ActivityDisplay(ActivityStackSupervisor supervisor, Display display) {
        mSupervisor = supervisor;
        mDisplayId = display.getDisplayId();
+15 −8
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.INVALID_DISPLAY;

import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
@@ -1901,14 +1902,20 @@ class ActivityStarter {
        // except...  well, with SINGLE_TASK_LAUNCH it's not entirely clear. We'd like to have
        // the same behavior as if a new instance was being started, which means not bringing it
        // to the front if the caller is not itself in the front.
        final ActivityStack focusStack = mSupervisor.getTopDisplayFocusedStack();
        ActivityRecord curTop = (focusStack == null)
        final boolean differentTopTask;
        if (mPreferredDisplayId == mTargetStack.mDisplayId) {
            final ActivityStack focusStack = mTargetStack.getDisplay().getFocusedStack();
            final ActivityRecord curTop = (focusStack == null)
                    ? null : focusStack.topRunningNonDelayedActivityLocked(mNotTop);

            final TaskRecord topTask = curTop != null ? curTop.getTask() : null;
        if (topTask != null
                && (topTask != intentActivity.getTask() || topTask != focusStack.topTask())
                && !mAvoidMoveToFront) {
            differentTopTask = topTask != null
                    && (topTask != intentActivity.getTask() || topTask != focusStack.topTask());
        } else {
            // The existing task should always be different from those in other displays.
            differentTopTask = true;
        }

        if (differentTopTask && !mAvoidMoveToFront) {
            mStartActivity.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
            if (mSourceRecord == null || (mSourceStack.getTopActivity() != null &&
                    mSourceStack.getTopActivity().getTask() == mSourceRecord.getTask())) {
+3 −4
Original line number Diff line number Diff line
@@ -69,7 +69,6 @@ import org.mockito.invocation.InvocationOnMock;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityRecordTests extends ActivityTestsBase {
    private ActivityTaskManagerService mService;
    private TestActivityStack mStack;
    private TaskRecord mTask;
    private ActivityRecord mActivity;
@@ -79,10 +78,10 @@ public class ActivityRecordTests extends ActivityTestsBase {
    public void setUp() throws Exception {
        super.setUp();

        mService = createActivityTaskManagerService();
        mStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
        setupActivityTaskManagerService();
        mStack = mSupervisor.getDefaultDisplay().createStack(
                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
        mTask = new TaskBuilder(mService.mStackSupervisor).setStack(mStack).build();
        mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
        mActivity = new ActivityBuilder(mService).setTask(mTask).build();
    }

+1 −4
Original line number Diff line number Diff line
@@ -64,8 +64,6 @@ import java.util.ArrayList;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStackSupervisorTests extends ActivityTestsBase {
    private ActivityTaskManagerService mService;
    private ActivityStackSupervisor mSupervisor;
    private ActivityStack mFullscreenStack;

    @Before
@@ -73,8 +71,7 @@ public class ActivityStackSupervisorTests extends ActivityTestsBase {
    public void setUp() throws Exception {
        super.setUp();

        mService = createActivityTaskManagerService();
        mSupervisor = mService.mStackSupervisor;
        setupActivityTaskManagerService();
        mFullscreenStack = mService.mStackSupervisor.getDefaultDisplay().createStack(
                WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
    }
+2 −5
Original line number Diff line number Diff line
@@ -60,8 +60,6 @@ import org.junit.runner.RunWith;
@Presubmit
@RunWith(AndroidJUnit4.class)
public class ActivityStackTests extends ActivityTestsBase {
    private ActivityTaskManagerService mService;
    private ActivityStackSupervisor mSupervisor;
    private ActivityDisplay mDefaultDisplay;
    private ActivityStack mStack;
    private TaskRecord mTask;
@@ -71,9 +69,8 @@ public class ActivityStackTests extends ActivityTestsBase {
    public void setUp() throws Exception {
        super.setUp();

        mService = createActivityTaskManagerService();
        mSupervisor = mService.mStackSupervisor;
        mDefaultDisplay = mService.mStackSupervisor.getDefaultDisplay();
        setupActivityTaskManagerService();
        mDefaultDisplay = mSupervisor.getDefaultDisplay();
        mStack = mDefaultDisplay.createStack(WINDOWING_MODE_UNDEFINED, ACTIVITY_TYPE_STANDARD,
                true /* onTop */);
        mTask = new TaskBuilder(mSupervisor).setStack(mStack).build();
Loading