summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java8
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskSupervisor.java35
-rw-r--r--services/core/java/com/android/server/wm/TaskFragment.java31
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/TransitionTests.java13
4 files changed, 44 insertions, 43 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
index bcc37baa5b00..0f4645c0fdab 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/TransitionAnimationHelper.java
@@ -122,14 +122,14 @@ public class TransitionAnimationHelper {
? R.styleable.WindowAnimation_taskToFrontEnterAnimation
: R.styleable.WindowAnimation_taskToFrontExitAnimation;
} else if (type == TRANSIT_CLOSE) {
- if (isTask) {
+ if ((changeFlags & FLAG_TRANSLUCENT) != 0 && !enter) {
+ translucent = true;
+ }
+ if (isTask && !translucent) {
animAttr = enter
? R.styleable.WindowAnimation_taskCloseEnterAnimation
: R.styleable.WindowAnimation_taskCloseExitAnimation;
} else {
- if ((changeFlags & FLAG_TRANSLUCENT) != 0 && !enter) {
- translucent = true;
- }
animAttr = enter
? R.styleable.WindowAnimation_activityCloseEnterAnimation
: R.styleable.WindowAnimation_activityCloseExitAnimation;
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index be503fc61c4c..7d220df949e0 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -82,6 +82,7 @@ import static com.android.server.wm.Task.TAG_CLEANUP;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.ActivityManager;
@@ -261,6 +262,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
/** Helper for {@link Task#fillTaskInfo}. */
final TaskInfoHelper mTaskInfoHelper = new TaskInfoHelper();
+ final OpaqueActivityHelper mOpaqueActivityHelper = new OpaqueActivityHelper();
+
private final ActivityTaskSupervisorHandler mHandler;
final Looper mLooper;
@@ -2906,6 +2909,38 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
}
}
+ /** The helper to get the top opaque activity of a container. */
+ static class OpaqueActivityHelper implements Predicate<ActivityRecord> {
+ private ActivityRecord mStarting;
+ private boolean mIncludeInvisibleAndFinishing;
+
+ ActivityRecord getOpaqueActivity(@NonNull WindowContainer<?> container) {
+ mIncludeInvisibleAndFinishing = true;
+ return container.getActivity(this,
+ true /* traverseTopToBottom */, null /* boundary */);
+ }
+
+ ActivityRecord getVisibleOpaqueActivity(@NonNull WindowContainer<?> container,
+ @Nullable ActivityRecord starting) {
+ mStarting = starting;
+ mIncludeInvisibleAndFinishing = false;
+ final ActivityRecord opaque = container.getActivity(this,
+ true /* traverseTopToBottom */, null /* boundary */);
+ mStarting = null;
+ return opaque;
+ }
+
+ @Override
+ public boolean test(ActivityRecord r) {
+ if (!mIncludeInvisibleAndFinishing && !r.visibleIgnoringKeyguard && r != mStarting) {
+ // Ignore invisible activities that are not the currently starting activity
+ // (about to be visible).
+ return false;
+ }
+ return r.occludesParent(mIncludeInvisibleAndFinishing /* includingFinishing */);
+ }
+ }
+
/**
* Fills the info that needs to iterate all activities of task, such as the number of
* non-finishing activities and collecting launch cookies.
diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java
index 311b9a6d2876..3f7ab14d02be 100644
--- a/services/core/java/com/android/server/wm/TaskFragment.java
+++ b/services/core/java/com/android/server/wm/TaskFragment.java
@@ -102,8 +102,6 @@ import android.window.TaskFragmentOrganizerToken;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.protolog.common.ProtoLog;
-import com.android.internal.util.function.pooled.PooledLambda;
-import com.android.internal.util.function.pooled.PooledPredicate;
import com.android.server.am.HostingRecord;
import com.android.server.pm.pkg.AndroidPackage;
@@ -934,11 +932,10 @@ class TaskFragment extends WindowContainer<WindowContainer> {
if (!isAttached() || isForceHidden() || isForceTranslucent()) {
return true;
}
- final PooledPredicate p = PooledLambda.obtainPredicate(TaskFragment::isOpaqueActivity,
- PooledLambda.__(ActivityRecord.class), starting, false /* including*/);
- final ActivityRecord opaque = getActivity(p);
- p.recycle();
- return opaque == null;
+ // A TaskFragment isn't translucent if it has at least one visible activity that occludes
+ // this TaskFragment.
+ return mTaskSupervisor.mOpaqueActivityHelper.getVisibleOpaqueActivity(this,
+ starting) == null;
}
/**
@@ -951,25 +948,7 @@ class TaskFragment extends WindowContainer<WindowContainer> {
return true;
}
// Including finishing Activity if the TaskFragment is becoming invisible in the transition.
- final boolean includingFinishing = !isVisibleRequested();
- final PooledPredicate p = PooledLambda.obtainPredicate(TaskFragment::isOpaqueActivity,
- PooledLambda.__(ActivityRecord.class), null /* starting */, includingFinishing);
- final ActivityRecord opaque = getActivity(p);
- p.recycle();
- return opaque == null;
- }
-
- private static boolean isOpaqueActivity(@NonNull ActivityRecord r,
- @Nullable ActivityRecord starting, boolean includingFinishing) {
- if (!r.visibleIgnoringKeyguard && r != starting) {
- // Also ignore invisible activities that are not the currently starting
- // activity (about to be visible).
- return false;
- }
-
- // TaskFragment isn't translucent if it has at least one fullscreen activity that is
- // visible.
- return r.occludesParent(includingFinishing);
+ return mTaskSupervisor.mOpaqueActivityHelper.getOpaqueActivity(this) == null;
}
ActivityRecord getTopNonFinishingActivity() {
diff --git a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
index 43b429c76749..8e08b5aa4989 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TransitionTests.java
@@ -367,7 +367,6 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord act = createActivityRecord(tasks[i]);
// alternate so that the transition doesn't get promoted to the display area
act.setVisibleRequested((i % 2) == 0); // starts invisible
- act.visibleIgnoringKeyguard = (i % 2) == 0;
if (i == showWallpaperTask) {
doReturn(true).when(act).showWallpaper();
}
@@ -754,10 +753,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord closing = createActivityRecord(oldTask);
closing.setOccludesParent(true);
- closing.visibleIgnoringKeyguard = true;
final ActivityRecord opening = createActivityRecord(newTask);
opening.setOccludesParent(true);
- opening.visibleIgnoringKeyguard = true;
// Start states.
changes.put(newTask, new Transition.ChangeInfo(newTask, false /* vis */, true /* exChg */));
changes.put(oldTask, new Transition.ChangeInfo(oldTask, true /* vis */, false /* exChg */));
@@ -795,10 +792,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord closing = createActivityRecord(oldTask);
closing.setOccludesParent(true);
- closing.visibleIgnoringKeyguard = true;
final ActivityRecord opening = createActivityRecord(newTask);
opening.setOccludesParent(false);
- opening.visibleIgnoringKeyguard = true;
// Start states.
changes.put(newTask, new Transition.ChangeInfo(newTask, false /* vis */, true /* exChg */));
changes.put(oldTask, new Transition.ChangeInfo(oldTask, true /* vis */, false /* exChg */));
@@ -837,10 +832,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord closing = closingTaskFragment.getTopMostActivity();
closing.setOccludesParent(true);
- closing.visibleIgnoringKeyguard = true;
final ActivityRecord opening = openingTaskFragment.getTopMostActivity();
opening.setOccludesParent(true);
- opening.visibleIgnoringKeyguard = true;
// Start states.
changes.put(openingTaskFragment, new Transition.ChangeInfo(openingTaskFragment,
false /* vis */, true /* exChg */));
@@ -881,10 +874,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord closing = closingTaskFragment.getTopMostActivity();
closing.setOccludesParent(true);
- closing.visibleIgnoringKeyguard = true;
final ActivityRecord opening = openingTaskFragment.getTopMostActivity();
opening.setOccludesParent(false);
- opening.visibleIgnoringKeyguard = true;
// Start states.
changes.put(openingTaskFragment, new Transition.ChangeInfo(openingTaskFragment,
false /* vis */, true /* exChg */));
@@ -925,10 +916,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord opening = openingTaskFragment.getTopMostActivity();
opening.setOccludesParent(true);
- opening.visibleIgnoringKeyguard = true;
final ActivityRecord closing = closingTaskFragment.getTopMostActivity();
closing.setOccludesParent(true);
- closing.visibleIgnoringKeyguard = true;
closing.finishing = true;
// Start states.
changes.put(openingTaskFragment, new Transition.ChangeInfo(openingTaskFragment,
@@ -970,10 +959,8 @@ public class TransitionTests extends WindowTestsBase {
final ActivityRecord opening = openingTaskFragment.getTopMostActivity();
opening.setOccludesParent(true);
- opening.visibleIgnoringKeyguard = true;
final ActivityRecord closing = closingTaskFragment.getTopMostActivity();
closing.setOccludesParent(false);
- closing.visibleIgnoringKeyguard = true;
closing.finishing = true;
// Start states.
changes.put(openingTaskFragment, new Transition.ChangeInfo(openingTaskFragment,