diff options
4 files changed, 65 insertions, 15 deletions
diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/extensions/util/TestValueCountConsumer.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/extensions/util/TestValueCountConsumer.java index 34276f0298b..cb3159202df 100644 --- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/extensions/util/TestValueCountConsumer.java +++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/extensions/util/TestValueCountConsumer.java @@ -16,9 +16,13 @@ package android.server.wm.jetpack.extensions.util; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.window.extensions.core.util.function.Consumer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; @@ -67,6 +71,22 @@ public class TestValueCountConsumer<T> implements Consumer<T> { } /** + * Returns a list that contains the number of values set in + * {@link TestValueCountConsumer#setCount(int)}. + */ + @NonNull + public List<T> waitAndGetAllValues() throws InterruptedException { + List<T> values = new ArrayList<>(); + for (int i = 0; i < mCount; i++) { + T value = mLinkedBlockingQueue.poll(TIMEOUT_MS, TimeUnit.MILLISECONDS); + if (value != null) { + values.add(value); + } + } + return Collections.unmodifiableList(values); + } + + /** * Clears the queue of currently recorded values. */ public void clearQueue() { diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/layout/ExtensionWindowLayoutComponentTest.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/layout/ExtensionWindowLayoutComponentTest.java index 71a93d4c094..2d943da5795 100644 --- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/layout/ExtensionWindowLayoutComponentTest.java +++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/layout/ExtensionWindowLayoutComponentTest.java @@ -22,6 +22,7 @@ import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.EXTENSION import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.assertEqualWindowLayoutInfo; import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.assumeHasDisplayFeatures; import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.getExtensionWindowLayoutInfo; +import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.getWindowExtensions; import static android.server.wm.jetpack.extensions.util.ExtensionsUtil.isExtensionVersionAtLeast; import static android.server.wm.jetpack.extensions.util.SidecarUtil.assumeSidecarSupportedDevice; import static android.server.wm.jetpack.extensions.util.SidecarUtil.getSidecarInterface; @@ -437,16 +438,21 @@ public class ExtensionWindowLayoutComponentTest extends WindowManagerJetpackTest mWindowLayoutInfo = getExtensionWindowLayoutInfo(configHandlingActivity); assumeHasDisplayFeatures(mWindowLayoutInfo); - final WindowLayoutInfo initialInfo = getExtensionWindowLayoutInfo( - configHandlingActivity); + TestValueCountConsumer<WindowLayoutInfo> consumer = new TestValueCountConsumer<>(); + // We expect 3 values, 1 before entering PiP, one while in PiP, one after exiting PiP. + consumer.setCount(3); + getWindowExtensions().getWindowLayoutComponent().addWindowLayoutInfoListener( + configHandlingActivity, consumer); enterPipActivityHandlesConfigChanges(configHandlingActivity); exitPipActivityHandlesConfigChanges(configHandlingActivity); - final WindowLayoutInfo updatedInfo = getExtensionWindowLayoutInfo( - configHandlingActivity); + List<WindowLayoutInfo> values = consumer.waitAndGetAllValues(); - assertEquals(initialInfo, updatedInfo); + assertEquals(3, values.size()); + assertEquals(mWindowLayoutInfo, values.get(0)); + assertTrue(values.get(1).getDisplayFeatures().isEmpty()); + assertEquals(mWindowLayoutInfo, values.get(2)); } /** diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/TestActivity.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/TestActivity.java index e515baed57c..9161b6d1d1b 100644 --- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/TestActivity.java +++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/TestActivity.java @@ -17,9 +17,11 @@ package android.server.wm.jetpack.utils; import android.app.Activity; +import android.content.res.Configuration; import android.os.Bundle; import android.view.View; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import java.util.concurrent.CountDownLatch; @@ -31,6 +33,7 @@ import java.util.concurrent.TimeUnit; */ public class TestActivity extends Activity implements View.OnLayoutChangeListener { private CountDownLatch mLayoutLatch; + private CountDownLatch mOnConfigurationChangeLatch = new CountDownLatch(1); private static CountDownLatch sResumeLatch = new CountDownLatch(1); @Override @@ -48,6 +51,12 @@ public class TestActivity extends Activity implements View.OnLayoutChangeListene } @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mOnConfigurationChangeLatch.countDown(); + } + + @Override protected void onResume() { super.onResume(); sResumeLatch.countDown(); @@ -76,6 +85,27 @@ public class TestActivity extends Activity implements View.OnLayoutChangeListene } /** + * Resets the configuration change counter. + */ + public void resetOnConfigurationChangeCounter() { + mOnConfigurationChangeLatch = new CountDownLatch(1); + } + + /** + * Waits for a configuration change callback. + * + * @return {@code true} if the configuration change callback is triggered, {@code false} + * otherwise. + */ + public boolean waitForConfigurationChange() { + try { + return mOnConfigurationChangeLatch.await(3, TimeUnit.SECONDS); + } catch (InterruptedException e) { + return false; + } + } + + /** * Resets layout counter when waiting for a layout to happen before calling * {@link #waitForOnResume()}. */ diff --git a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/WindowManagerJetpackTestBase.java b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/WindowManagerJetpackTestBase.java index db0edf4dcb6..adfa8042ae7 100644 --- a/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/WindowManagerJetpackTestBase.java +++ b/tests/framework/base/windowmanager/jetpack/src/android/server/wm/jetpack/utils/WindowManagerJetpackTestBase.java @@ -281,28 +281,22 @@ public class WindowManagerJetpackTestBase extends ActivityManagerTestBase { if (activity.isInPictureInPictureMode()) { throw new IllegalStateException("Activity must not be in PiP"); } - activity.resetLayoutCounter(); + activity.resetOnConfigurationChangeCounter(); // Change the orientation PictureInPictureParams params = (new PictureInPictureParams.Builder()).build(); activity.enterPictureInPictureMode(params); - // Wait for the activity to layout, which will happen after the orientation change - assertTrue(activity.waitForLayout()); - // Check that orientation matches - assertTrue(activity.isInPictureInPictureMode()); + activity.waitForConfigurationChange(); } public static void exitPipActivityHandlesConfigChanges(TestActivity activity) { if (!activity.isInPictureInPictureMode()) { throw new IllegalStateException("Activity must be in PiP"); } - activity.resetLayoutCounter(); + activity.resetOnConfigurationChangeCounter(); Intent intent = new Intent(activity, activity.getClass()); intent.addFlags(FLAG_ACTIVITY_SINGLE_TOP); activity.startActivity(intent); - // Wait for the activity to layout, which will happen after the orientation change - assertTrue(activity.waitForLayout()); - // Check that orientation matches - assertFalse(activity.isInPictureInPictureMode()); + activity.waitForConfigurationChange(); } public static void setActivityOrientationActivityDoesNotHandleOrientationChanges( |