Loading services/core/java/com/android/server/wm/BackgroundActivityStartController.java +18 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java +24 −6 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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); Loading services/core/java/com/android/server/wm/LockTaskController.java +2 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading Loading
services/core/java/com/android/server/wm/BackgroundActivityStartController.java +18 −8 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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, Loading
services/core/java/com/android/server/wm/EnsureActivitiesVisibleHelper.java +24 −6 Original line number Diff line number Diff line Loading @@ -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. */ Loading Loading @@ -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); Loading
services/core/java/com/android/server/wm/LockTaskController.java +2 −3 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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 Loading