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

Commit efd3e11f authored by Chris Li's avatar Chris Li
Browse files

Allow multiple adjacent TFs (9/n)

Update TaskFragment#getVisibility

Bug: 373709676
Test: refactor, pass existing test
Flag: com.android.window.flags.allow_multiple_adjacent_task_fragments
Change-Id: Ie1e4cb7ccff88271635625dc3bb8542ac42939b1
parent 0d464ac3
Loading
Loading
Loading
Loading
+45 −17
Original line number Diff line number Diff line
@@ -1339,17 +1339,27 @@ class TaskFragment extends WindowContainer<WindowContainer> {
                    mTmpRect.set(getBounds());
                    for (int j = adjacentTaskFragments.size() - 1; j >= 0; --j) {
                        final TaskFragment taskFragment = adjacentTaskFragments.get(j);
                        final TaskFragment adjacentTaskFragment =
                                taskFragment.mAdjacentTaskFragment;
                        if (adjacentTaskFragment == this) {
                        if (taskFragment.isAdjacentTo(this)) {
                            continue;
                        }
                        if (Flags.allowMultipleAdjacentTaskFragments()) {
                            final boolean isOccluding = mTmpRect.intersect(taskFragment.getBounds())
                                    || taskFragment.forOtherAdjacentTaskFragments(adjacentTf -> {
                                        return mTmpRect.intersect(adjacentTf.getBounds());
                                    });
                            if (isOccluding) {
                                return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
                            }
                        } else {
                            final TaskFragment adjacentTaskFragment =
                                    taskFragment.mAdjacentTaskFragment;
                            if (mTmpRect.intersect(taskFragment.getBounds())
                                    || mTmpRect.intersect(adjacentTaskFragment.getBounds())) {
                                return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
                            }
                        }
                    }
                }
                // Should be visible if there is no other fragment occluding it, unless it doesn't
                // have any running activities, not starting one and not home stack.
                shouldBeVisible = hasRunningActivities
@@ -1374,7 +1384,25 @@ class TaskFragment extends WindowContainer<WindowContainer> {
            }

            final TaskFragment otherTaskFrag = other.asTaskFragment();
            if (otherTaskFrag != null && otherTaskFrag.mAdjacentTaskFragment != null) {
            if (otherTaskFrag != null && otherTaskFrag.hasAdjacentTaskFragment()) {
                if (Flags.allowMultipleAdjacentTaskFragments()) {
                    final boolean hasTraversedAdj = otherTaskFrag.forOtherAdjacentTaskFragments(
                            adjacentTaskFragments::contains);
                    if (hasTraversedAdj) {
                        final boolean isTranslucent = otherTaskFrag.isTranslucent(starting)
                                || otherTaskFrag.forOtherAdjacentTaskFragments(adjacentTf -> {
                                    return adjacentTf.isTranslucent(starting);
                                });
                        if (isTranslucent) {
                            // Can be visible behind a translucent adjacent TaskFragments.
                            gotTranslucentFullscreen = true;
                            gotTranslucentAdjacent = true;
                            continue;
                        }
                        // Can not be visible behind adjacent TaskFragments.
                        return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
                    }
                } else {
                    if (adjacentTaskFragments.contains(otherTaskFrag.mAdjacentTaskFragment)) {
                        if (otherTaskFrag.isTranslucent(starting)
                                || otherTaskFrag.mAdjacentTaskFragment.isTranslucent(starting)) {
@@ -1385,10 +1413,10 @@ class TaskFragment extends WindowContainer<WindowContainer> {
                        }
                        // Can not be visible behind adjacent TaskFragments.
                        return TASK_FRAGMENT_VISIBILITY_INVISIBLE;
                } else {
                    adjacentTaskFragments.add(otherTaskFrag);
                    }
                }
                adjacentTaskFragments.add(otherTaskFrag);
            }

        }