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

Commit 445eb4e4 authored by Chris Li's avatar Chris Li Committed by Android (Google) Code Review
Browse files

Merge "Allow multiple adjacent TFs (7/n)" into main

parents 8664e205 fe02ed6d
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -90,6 +90,7 @@ import com.android.internal.util.Preconditions;
import com.android.server.UiThread;
import com.android.server.am.PendingIntentRecord;
import com.android.server.wm.BackgroundLaunchProcessController.BalCheckConfiguration;
import com.android.window.flags.Flags;

import java.lang.annotation.Retention;
import java.util.ArrayList;
@@ -1650,19 +1651,28 @@ public class BackgroundActivityStartController {
            return bas;
        }

        TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment();
        if (adjacentTaskFragment == null) {
        if (!taskFragment.hasAdjacentTaskFragment()) {
            return bas;
        }

        // Check the second fragment.
        // Check the adjacent fragment.
        if (!Flags.allowMultipleAdjacentTaskFragments()) {
            TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment();
            topActivity = adjacentTaskFragment.getActivity(topOfStackPredicate);
            if (topActivity == null) {
                return bas;
            }

            return checkCrossUidActivitySwitchFromBelow(topActivity, uid, bas);
        }
        final BlockActivityStart[] out = { bas };
        taskFragment.forOtherAdjacentTaskFragments(adjacentTaskFragment -> {
            final ActivityRecord top = adjacentTaskFragment.getActivity(topOfStackPredicate);
            if (top != null) {
                out[0] = checkCrossUidActivitySwitchFromBelow(top, uid, out[0]);
            }
        });
        return out[0];
    }

    /**
     * Determines if a source is allowed to add or remove activities from the task,
+24 −6
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import static com.android.server.wm.Task.TAG_VISIBILITY;
import android.annotation.Nullable;
import android.util.Slog;

import com.android.window.flags.Flags;

import java.util.ArrayList;

/** Helper class to ensure activities are in the right visible state for a container. */
@@ -110,21 +112,37 @@ class EnsureActivitiesVisibleHelper {

                if (adjacentTaskFragments != null && adjacentTaskFragments.contains(
                        childTaskFragment)) {
                    if (!childTaskFragment.isTranslucent(starting)
                            && !childTaskFragment.getAdjacentTaskFragment().isTranslucent(
                                    starting)) {
                    final boolean isTranslucent;
                    if (Flags.allowMultipleAdjacentTaskFragments()) {
                        isTranslucent = childTaskFragment.isTranslucent(starting)
                                || childTaskFragment.forOtherAdjacentTaskFragments(
                                        adjacentTaskFragment -> {
                                            return adjacentTaskFragment.isTranslucent(starting);
                                        });
                    } else {
                        isTranslucent = childTaskFragment.isTranslucent(starting)
                                || childTaskFragment.getAdjacentTaskFragment()
                                .isTranslucent(starting);
                    }
                    if (!isTranslucent) {
                        // Everything behind two adjacent TaskFragments are occluded.
                        mBehindFullyOccludedContainer = true;
                    }
                    continue;
                }

                final TaskFragment adjacentTaskFrag = childTaskFragment.getAdjacentTaskFragment();
                if (adjacentTaskFrag != null) {
                if (childTaskFragment.hasAdjacentTaskFragment()) {
                    if (adjacentTaskFragments == null) {
                        adjacentTaskFragments = new ArrayList<>();
                    }
                    adjacentTaskFragments.add(adjacentTaskFrag);
                    if (Flags.allowMultipleAdjacentTaskFragments()) {
                        final ArrayList<TaskFragment> adjacentTfs = adjacentTaskFragments;
                        childTaskFragment.forOtherAdjacentTaskFragments(adjacentTf -> {
                            adjacentTfs.add(adjacentTf);
                        });
                    } else {
                        adjacentTaskFragments.add(childTaskFragment.getAdjacentTaskFragment());
                    }
                }
            } else if (child.asActivityRecord() != null) {
                setActivityVisibilityState(child.asActivityRecord(), starting, resumeTopActivity);
+2 −3
Original line number Diff line number Diff line
@@ -263,10 +263,9 @@ public class LockTaskController {
        // should be finish together in the Task.
        if (activity != taskRoot || activity != taskTop) {
            final TaskFragment taskFragment = activity.getTaskFragment();
            final TaskFragment adjacentTaskFragment = taskFragment.getAdjacentTaskFragment();
            if (taskFragment.asTask() != null
                    || !taskFragment.isDelayLastActivityRemoval()
                    || adjacentTaskFragment == null) {
                    || !taskFragment.hasAdjacentTaskFragment()) {
                // Don't block activity from finishing if the TaskFragment don't have any adjacent
                // TaskFragment, or it won't finish together with its adjacent TaskFragment.
                return false;
@@ -281,7 +280,7 @@ public class LockTaskController {
            }

            final boolean hasOtherActivityInTask = task.getActivity(a -> !a.finishing
                    && a != activity && a.getTaskFragment() != adjacentTaskFragment) != null;
                    && a != activity && !taskFragment.isAdjacentTo(a.getTaskFragment())) != null;
            if (hasOtherActivityInTask) {
                // Do not block activity from finishing if there are another running activities
                // after the current and adjacent TaskFragments are removed. Note that we don't