summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java2
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java7
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java30
3 files changed, 33 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 6d53786ddf41..0ff0f670f29d 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -2085,7 +2085,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
/** Returns true if this activity is opaque and fills the entire space of this task. */
boolean occludesParent() {
- return mOccludesParent;
+ return !finishing && mOccludesParent;
}
boolean setOccludesParent(boolean occludesParent) {
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index c6f375ea5d18..960b92cd0488 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -2343,7 +2343,7 @@ class ActivityStack extends Task {
// Starting activity cannot be occluding activity, otherwise starting window could be
// remove immediately without transferring to starting activity.
final ActivityRecord occludingActivity = getActivity(
- (ar) -> !ar.finishing && ar.occludesParent(), true, r);
+ (ar) -> ar.occludesParent(), true, r);
if (occludingActivity != null) {
// Here it is! Now, if this is not yet visible (occluded by another task) to the
// user, then just add it without starting; it will get started when the user
@@ -3069,9 +3069,8 @@ class ActivityStack extends Task {
}
// See if there is an occluding activity on-top of this one.
- final ActivityRecord occludingActivity = getActivity((ar) ->
- ar.occludesParent() && !ar.finishing,
- r, false /*includeBoundary*/, true /*traverseTopToBottom*/);
+ final ActivityRecord occludingActivity = getActivity((ar) -> ar.occludesParent(), r,
+ false /*includeBoundary*/, true /*traverseTopToBottom*/);
if (occludingActivity != null) return false;
if (r.finishing) Slog.e(TAG, "willActivityBeVisible: Returning false,"
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index 52fc3de89451..12934ee8bb78 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -27,6 +27,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.content.pm.ActivityInfo.FLAG_RESUME_WHILE_PAUSING;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doCallRealMethod;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doNothing;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
@@ -56,7 +57,6 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
import android.app.ActivityManager;
import android.app.IApplicationThread;
@@ -1157,6 +1157,34 @@ public class ActivityStackTests extends ActivityTestsBase {
}
@Test
+ public void testCheckBehindFullscreenActivity() {
+ final ActivityRecord bottomActivity =
+ new ActivityBuilder(mService).setStack(mStack).setTask(mTask).build();
+ final ActivityRecord topActivity =
+ new ActivityBuilder(mService).setStack(mStack).setTask(mTask).build();
+ doReturn(true).when(mStack).shouldBeVisible(any());
+ assertTrue(mStack.checkBehindFullscreenActivity(bottomActivity,
+ null /* handleBehindFullscreenActivity */));
+ assertFalse(mStack.checkBehindFullscreenActivity(topActivity,
+ null /* handleBehindFullscreenActivity */));
+
+ doReturn(false).when(topActivity).occludesParent();
+ assertFalse(mStack.checkBehindFullscreenActivity(bottomActivity,
+ null /* handleBehindFullscreenActivity */));
+ assertFalse(mStack.checkBehindFullscreenActivity(topActivity,
+ null /* handleBehindFullscreenActivity */));
+
+ final ActivityRecord finishingActivity =
+ new ActivityBuilder(mService).setStack(mStack).setTask(mTask).build();
+ finishingActivity.finishing = true;
+ doCallRealMethod().when(finishingActivity).occludesParent();
+ assertFalse(mStack.checkBehindFullscreenActivity(bottomActivity,
+ null /* handleBehindFullscreenActivity */));
+ assertFalse(mStack.checkBehindFullscreenActivity(topActivity,
+ null /* handleBehindFullscreenActivity */));
+ }
+
+ @Test
public void testClearUnknownAppVisibilityBehindFullscreenActivity() {
final UnknownAppVisibilityController unknownAppVisibilityController =
mDefaultDisplay.mDisplayContent.mUnknownAppVisibilityController;