diff options
4 files changed, 132 insertions, 0 deletions
diff --git a/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt new file mode 100644 index 000000000000..8c0a524cda1e --- /dev/null +++ b/libs/WindowManager/Shell/tests/flicker/pip/src/com/android/wm/shell/flicker/pip/AutoEnterPipWithSourceRectHintTest.kt @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.wm.shell.flicker.pip + +import android.platform.test.annotations.Presubmit +import android.tools.common.traces.component.ComponentNameMatcher +import android.tools.device.flicker.junit.FlickerParametersRunnerFactory +import android.tools.device.flicker.legacy.FlickerBuilder +import android.tools.device.flicker.legacy.LegacyFlickerTest +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test auto entering pip using a source rect hint. + * + * To run this test: `atest AutoEnterPipWithSourceRectHintTest` + * + * Actions: + * ``` + * Launch an app in full screen + * Select "Auto-enter PiP" radio button + * Press "Set SourceRectHint" to create a temporary view that is used as the source rect hint + * Press Home button or swipe up to go Home and put [pipApp] in pip mode + * ``` + * + * Notes: + * ``` + * 1. All assertions are inherited from [AutoEnterPipOnGoToHomeTest] + * 2. Part of the test setup occurs automatically via + * [android.tools.device.flicker.legacy.runner.TransitionRunner], + * including configuring navigation mode, initial orientation and ensuring no + * apps are running before setup + * ``` + */ +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +class AutoEnterPipWithSourceRectHintTest(flicker: LegacyFlickerTest) : + AutoEnterPipOnGoToHomeTest(flicker) { + override val defaultEnterPip: FlickerBuilder.() -> Unit = { + setup { + pipApp.launchViaIntent(wmHelper) + pipApp.setSourceRectHint() + pipApp.enableAutoEnterForPipActivity() + } + } + + @Presubmit + @Test + fun pipOverlayNotShown() { + val overlay = ComponentNameMatcher.PIP_CONTENT_OVERLAY + flicker.assertLayers { + this.notContains(overlay) + } + } + @Presubmit + @Test + override fun pipOverlayLayerAppearThenDisappear() { + // we don't use overlay when entering with sourceRectHint + } + + @Presubmit + @Test + override fun pipLayerOrOverlayRemainInsideVisibleBounds() { + // TODO (b/323511194): Looks like there is some bounciness with pip when using + // auto enter and sourceRectHint that causes the app to move outside of the display + // bounds during the transition. + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt index f628af14a0b9..452c98c65a7f 100644 --- a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt +++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/PipAppHelper.kt @@ -296,6 +296,10 @@ open class PipAppHelper(instrumentation: Instrumentation) : clickObject(MEDIA_SESSION_START_RADIO_BUTTON_ID) } + fun setSourceRectHint() { + clickObject(SOURCE_RECT_HINT) + } + fun checkWithCustomActionsCheckbox() = uiDevice .findObject(By.res(packageName, WITH_CUSTOM_ACTIONS_BUTTON_ID)) @@ -444,6 +448,7 @@ open class PipAppHelper(instrumentation: Instrumentation) : private const val MEDIA_SESSION_START_RADIO_BUTTON_ID = "media_session_start" private const val ENTER_PIP_ON_USER_LEAVE_HINT = "enter_pip_on_leave_manual" private const val ENTER_PIP_AUTOENTER = "enter_pip_on_leave_autoenter" + private const val SOURCE_RECT_HINT = "set_source_rect_hint" // minimum number of steps to take, when animating gestures, needs to be 2 // so that there is at least a single intermediate layer that flicker tests can check private const val MIN_STEPS_TO_ANIMATE = 2 diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml index f7ba45b25d48..36cbf1a8fe84 100644 --- a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_pip.xml @@ -27,6 +27,15 @@ where things are arranged differently and to circle back up to the top once we reach the bottom. --> + <!-- View used for testing sourceRectHint. --> + <View + android:id="@+id/source_rect" + android:layout_width="320dp" + android:layout_height="180dp" + android:visibility="gone" + android:background="@android:color/holo_green_light" + /> + <Button android:id="@+id/enter_pip" android:layout_width="wrap_content" @@ -113,6 +122,13 @@ android:onClick="onRatioSelected"/> </RadioGroup> + <Button + android:id="@+id/set_source_rect_hint" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="Set SourceRectHint" + android:onClick="setSourceRectHint"/> + <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java index 12eaad108fc6..1ab8ddbe20e2 100644 --- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/PipActivity.java @@ -37,6 +37,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.Rect; import android.graphics.drawable.Icon; import android.media.MediaMetadata; import android.media.session.MediaSession; @@ -45,6 +46,7 @@ import android.os.Bundle; import android.util.Log; import android.util.Rational; import android.view.View; +import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.widget.CheckBox; @@ -248,6 +250,29 @@ public class PipActivity extends Activity { } } + /** + * Adds a temporary view used for testing sourceRectHint. + * + */ + public void setSourceRectHint(View v) { + View rectView = findViewById(R.id.source_rect); + if (rectView != null) { + rectView.setVisibility(View.VISIBLE); + rectView.getViewTreeObserver().addOnGlobalLayoutListener( + new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + Rect boundingRect = new Rect(); + rectView.getGlobalVisibleRect(boundingRect); + mPipParamsBuilder.setSourceRectHint(boundingRect); + setPictureInPictureParams(mPipParamsBuilder.build()); + rectView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } + }); + rectView.invalidate(); // changing the visibility, invalidating to redraw the view + } + } + public void onRatioSelected(View v) { switch (v.getId()) { case R.id.ratio_default: |