Add CTS for fullscreen split screen consuming
Bug: 129272201
Test: atest WindowPolicyTest#testForcedConsumedTopInsets
Change-Id: I71c97ca748c253e1e4f8f8572ade12283a90b67a
diff --git a/tests/framework/base/windowmanager/AndroidManifest.xml b/tests/framework/base/windowmanager/AndroidManifest.xml
index fd4cf03..4f8fe3d 100644
--- a/tests/framework/base/windowmanager/AndroidManifest.xml
+++ b/tests/framework/base/windowmanager/AndroidManifest.xml
@@ -279,6 +279,8 @@
<activity android:name="android.server.wm.WindowInsetsPolicyTest$TestActivity"
android:turnScreenOn="true"
android:showWhenLocked="true"/>
+ <activity android:name="android.server.wm.WindowInsetsPolicyTest$FullscreenTestActivity"/>
+ <activity android:name="android.server.wm.WindowInsetsPolicyTest$FullscreenWmFlagsTestActivity"/>
<activity android:name="android.server.wm.LayoutTests$TestActivity"
android:theme="@style/no_animation" />
<activity android:name="android.server.wm.LocationOnScreenTests$TestActivity"
diff --git a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
index 50c2633..f73d5a6 100644
--- a/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
+++ b/tests/framework/base/windowmanager/src/android/server/wm/WindowInsetsPolicyTest.java
@@ -16,20 +16,35 @@
package android.server.wm;
+import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
+import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
+import static android.server.wm.app.Components.LAUNCHING_ACTIVITY;
+import static android.server.wm.app.Components.TEST_ACTIVITY;
+import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Surface.ROTATION_0;
+import static android.view.Surface.ROTATION_90;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assume.assumeTrue;
import android.app.Activity;
+import android.content.ComponentName;
import android.graphics.Insets;
import android.os.Bundle;
import android.platform.test.annotations.Presubmit;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowInsets;
+import android.view.WindowManager;
+import android.view.WindowManager.LayoutParams;
import androidx.test.rule.ActivityTestRule;
@@ -38,6 +53,8 @@
import org.hamcrest.CustomTypeSafeMatcher;
import org.hamcrest.Matcher;
import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ErrorCollector;
@@ -45,7 +62,9 @@
import java.util.function.Supplier;
@Presubmit
-public class WindowInsetsPolicyTest {
+public class WindowInsetsPolicyTest extends ActivityManagerTestBase {
+
+ private ComponentName mTestActivityComponentName;
@Rule
public final ErrorCollector mErrorCollector = new ErrorCollector();
@@ -55,6 +74,23 @@
new ActivityTestRule<>(TestActivity.class, false /* initialTouchMode */,
false /* launchActivity */);
+ @Rule
+ public final ActivityTestRule<FullscreenTestActivity> mFullscreenTestActivity =
+ new ActivityTestRule<>(FullscreenTestActivity.class, false /* initialTouchMode */,
+ false /* launchActivity */);
+
+ @Rule
+ public final ActivityTestRule<FullscreenWmFlagsTestActivity> mFullscreenWmFlagsTestActivity =
+ new ActivityTestRule<>(FullscreenWmFlagsTestActivity.class,
+ false /* initialTouchMode */, false /* launchActivity */);
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mTestActivityComponentName = new ComponentName(mContext, TestActivity.class);
+ }
+
@Test
public void testWindowInsets_dispatched() {
final TestActivity activity = launchAndWait(mTestActivity);
@@ -75,6 +111,56 @@
commonAsserts(insets);
}
+ /**
+ * Tests whether an activity in split screen gets the top insets force consumed if
+ * {@link View#SYSTEM_UI_FLAG_FULLSCREEN} is set, and doesn't otherwise.
+ */
+ @Test
+ public void testForcedConsumedTopInsets() throws Exception {
+ assumeTrue("Skipping test: no split multi-window support",
+ supportsSplitScreenMultiWindow());
+
+ mAmWmState.computeState(new ComponentName[] {});
+ boolean naturalOrientationPortrait =
+ mAmWmState.getWmState().getDisplay(DEFAULT_DISPLAY)
+ .mFullConfiguration.orientation == ORIENTATION_PORTRAIT;
+
+ try (final RotationSession rotationSession = new RotationSession()) {
+ rotationSession.set(naturalOrientationPortrait ? ROTATION_90 : ROTATION_0);
+
+ launchActivityInSplitScreenWithRecents(LAUNCHING_ACTIVITY);
+ final TestActivity activity = launchAndWait(mTestActivity);
+ mAmWmState.computeState(mTestActivityComponentName);
+
+ mAmWmState.assertContainsStack("Must contain fullscreen stack.",
+ WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD);
+ mAmWmState.assertContainsStack("Must contain docked stack.",
+ WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, ACTIVITY_TYPE_STANDARD);
+
+ mAmWmState.computeState(LAUNCHING_ACTIVITY, mTestActivityComponentName);
+
+ // Ensure that top insets are not consumed for LAYOUT_FULLSCREEN
+ WindowInsets insets = getOnMainSync(activity::getDispatchedInsets);
+ WindowInsets rootInsets = getOnMainSync(activity::getRootInsets);
+ assertEquals("top inset must be dispatched in split screen",
+ rootInsets.getSystemWindowInsetTop(), insets.getSystemWindowInsetTop());
+
+ // Ensure that top insets are fully consumed for FULLSCREEN
+ final TestActivity fullscreenActivity = launchAndWait(mFullscreenTestActivity);
+ insets = getOnMainSync(fullscreenActivity::getDispatchedInsets);
+ assertEquals("top insets must be consumed if FULLSCREEN is set",
+ 0, insets.getSystemWindowInsetTop());
+
+ // Ensure that top insets are fully consumed for FULLSCREEN when setting it over wm
+ // layout params
+ final TestActivity fullscreenWmFlagsActivity =
+ launchAndWait(mFullscreenWmFlagsTestActivity);
+ insets = getOnMainSync(fullscreenWmFlagsActivity::getDispatchedInsets);
+ assertEquals("top insets must be consumed if FULLSCREEN is set",
+ 0, insets.getSystemWindowInsetTop());
+ }
+ }
+
private void commonAsserts(WindowInsets insets) {
assertForAllInsets("must be non-negative", insets, insetsGreaterThanOrEqualTo(Insets.NONE));
@@ -178,4 +264,23 @@
}
}
+ public static class FullscreenTestActivity extends TestActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getDecorView().setSystemUiVisibility(
+ getDecorView().getSystemUiVisibility() | View.SYSTEM_UI_FLAG_FULLSCREEN);
+ }
+ }
+
+ public static class FullscreenWmFlagsTestActivity extends TestActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN);
+ }
+ }
+
}