diff options
Diffstat (limited to 'tests')
15 files changed, 316 insertions, 81 deletions
diff --git a/tests/FlickerTests/Android.bp b/tests/FlickerTests/Android.bp index 72b515947ca6..3e67286998bc 100644 --- a/tests/FlickerTests/Android.bp +++ b/tests/FlickerTests/Android.bp @@ -93,6 +93,7 @@ java_defaults { "flickerlib-helpers", "platform-test-annotations", "wm-flicker-common-app-helpers", + "wm-shell-flicker-utils", ], data: [ ":FlickerTestApp", diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/ActivityEmbeddingTestBase.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/ActivityEmbeddingTestBase.kt index 45cd65d9776c..45176448a9f4 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/ActivityEmbeddingTestBase.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/ActivityEmbeddingTestBase.kt @@ -17,9 +17,12 @@ package com.android.server.wm.flicker.activityembedding import android.tools.device.flicker.legacy.LegacyFlickerTest +import android.platform.test.annotations.Presubmit +import android.tools.common.traces.component.ComponentNameMatcher import com.android.server.wm.flicker.BaseTest import com.android.server.wm.flicker.helpers.ActivityEmbeddingAppHelper import org.junit.Before +import org.junit.Test abstract class ActivityEmbeddingTestBase(flicker: LegacyFlickerTest) : BaseTest(flicker) { val testApp = ActivityEmbeddingAppHelper(instrumentation) @@ -29,4 +32,14 @@ abstract class ActivityEmbeddingTestBase(flicker: LegacyFlickerTest) : BaseTest( // The test should only be run on devices that support ActivityEmbedding. ActivityEmbeddingAppHelper.assumeActivityEmbeddingSupportedDevice() } + + /** Asserts the background animation layer is never visible during bounds change transition. */ + @Presubmit + @Test + fun backgroundLayerNeverVisible() { + val backgroundColorLayer = ComponentNameMatcher("", "Animation Background") + flicker.assertLayers { + isInvisible(backgroundColorLayer) + } + } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt new file mode 100644 index 000000000000..badd876ae321 --- /dev/null +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/layoutchange/HorizontalSplitChangeRatioTest.kt @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2023 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.server.wm.flicker.activityembedding + +import android.platform.test.annotations.Presubmit +import android.tools.common.datatypes.Rect +import android.tools.device.flicker.junit.FlickerParametersRunnerFactory +import android.tools.device.flicker.legacy.FlickerBuilder +import android.tools.device.flicker.legacy.LegacyFlickerTest +import android.tools.device.flicker.legacy.LegacyFlickerTestFactory +import com.android.server.wm.flicker.helpers.ActivityEmbeddingAppHelper +import androidx.test.filters.RequiresDevice +import org.junit.FixMethodOrder +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.MethodSorters +import org.junit.runners.Parameterized + +/** + * Test changing split ratio at runtime on a horizona split. + * + * Setup: Launch A|B in horizontal split with B being the secondary activity, by default A and B + * windows are equal in size. B is on the top and A is on the bottom. + * Transitions: + * Change the split ratio to A:B=0.7:0.3, expect bounds change for both A and B. + * + * To run this test: `atest FlickerTests:HorizontalSplitChangeRatioTest` + */ +@RequiresDevice +@RunWith(Parameterized::class) +@Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +class HorizontalSplitChangeRatioTest(flicker: LegacyFlickerTest) : + ActivityEmbeddingTestBase(flicker) { + /** {@inheritDoc} */ + override val transition: FlickerBuilder.() -> Unit = { + setup { + tapl.setExpectedRotationCheckEnabled(false) + testApp.launchViaIntent(wmHelper) + testApp.launchSecondaryActivityHorizontally(wmHelper) + startDisplayBounds = + wmHelper.currentState.layerState.physicalDisplayBounds + ?: error("Display not found") + } + transitions { + testApp.changeSecondaryActivityRatio(wmHelper) + } + teardown { + tapl.goHome() + testApp.exit(wmHelper) + } + } + + /** Assert the Main activity window is always visible. */ + @Presubmit + @Test + fun mainActivityWindowIsAlwaysVisible() { + flicker.assertWm { isAppWindowVisible(ActivityEmbeddingAppHelper.MAIN_ACTIVITY_COMPONENT) } + } + + /** Assert the Main activity window is always visible. */ + @Presubmit + @Test + fun mainActivityLayerIsAlwaysVisible() { + flicker.assertLayers { isVisible(ActivityEmbeddingAppHelper.MAIN_ACTIVITY_COMPONENT) } + } + + /** Assert the Secondary activity window is always visible. */ + @Presubmit + @Test + fun secondaryActivityWindowIsAlwaysVisible() { + flicker.assertWm { + isAppWindowVisible(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT) } + } + + /** Assert the Secondary activity window is always visible. */ + @Presubmit + @Test + fun secondaryActivityLayerIsAlwaysVisible() { + flicker.assertLayers { isVisible(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT) } + } + + /** Assert the Main and Secondary activity change height during the transition. */ + @Presubmit + @Test + fun secondaryActivityAdjustsHeightRuntime() { + flicker.assertLayersStart { + val topLayerRegion = + this.visibleRegion(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT) + val bottomLayerRegion = + this.visibleRegion(ActivityEmbeddingAppHelper.MAIN_ACTIVITY_COMPONENT) + // Compare dimensions of two splits, given we're using default split attributes, + // both activities take up the same visible size on the display. + check { "height" } + .that(topLayerRegion.region.height).isEqual(bottomLayerRegion.region.height) + check { "width" } + .that(topLayerRegion.region.width).isEqual(bottomLayerRegion.region.width) + topLayerRegion.notOverlaps(bottomLayerRegion.region) + // Layers of two activities sum to be fullscreen size on display. + topLayerRegion.plus(bottomLayerRegion.region).coversExactly(startDisplayBounds) + } + + flicker.assertLayersEnd { + val topLayerRegion = + this.visibleRegion(ActivityEmbeddingAppHelper.SECONDARY_ACTIVITY_COMPONENT) + val bottomLayerRegion = + this.visibleRegion(ActivityEmbeddingAppHelper.MAIN_ACTIVITY_COMPONENT) + // Compare dimensions of two splits, given we're using default split attributes, + // both activities take up the same visible size on the display. + check { "height" } + .that(topLayerRegion.region.height).isLower(bottomLayerRegion.region.height) + check { "height" } + .that( + topLayerRegion.region.height / 0.3f - + bottomLayerRegion.region.height / 0.7f) + .isLower(0.1f) + check { "width" } + .that(topLayerRegion.region.width).isEqual(bottomLayerRegion.region.width) + topLayerRegion.notOverlaps(bottomLayerRegion.region) + // Layers of two activities sum to be fullscreen size on display. + topLayerRegion.plus(bottomLayerRegion.region).coversExactly(startDisplayBounds) + } + } + + companion object { + /** {@inheritDoc} */ + private var startDisplayBounds = Rect.EMPTY + /** + * Creates the test configurations. + * + * See [LegacyFlickerTestFactory.nonRotationTests] for configuring screen orientation and + * navigation modes. + */ + @Parameterized.Parameters(name = "{0}") + @JvmStatic + fun getParams() = LegacyFlickerTestFactory.nonRotationTests() + } +}
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt index 27de12e7dfdb..404f3290f04a 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenThirdActivityOverSplitTest.kt @@ -142,14 +142,6 @@ class OpenThirdActivityOverSplitTest(flicker: LegacyFlickerTest) : } } - /** Assert the background animation layer is never visible during transition. */ - @Presubmit - @Test - fun backgroundLayerNeverVisible() { - val backgroundColorLayer = ComponentNameMatcher("", "Animation Background") - flicker.assertLayers { isInvisible(backgroundColorLayer) } - } - companion object { /** {@inheritDoc} */ private var startDisplayBounds = Rect.EMPTY diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt index 6722cc8fd021..aaf0158a9d47 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/activityembedding/open/OpenTrampolineActivityTest.kt @@ -16,6 +16,7 @@ package com.android.server.wm.flicker.activityembedding +import android.platform.test.annotations.FlakyTest import android.platform.test.annotations.Presubmit import android.tools.common.datatypes.Rect import android.tools.common.flicker.subject.region.RegionSubject @@ -161,6 +162,7 @@ class OpenTrampolineActivityTest(flicker: LegacyFlickerTest) : ActivityEmbedding } } + @FlakyTest(bugId = 290736037) /** Main activity should go from fullscreen to being a split with secondary activity. */ @Presubmit @Test diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt index 2d3bc2d5eb15..35353c62d7e6 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ActivityEmbeddingAppHelper.kt @@ -45,18 +45,22 @@ constructor( * based on the split pair rule. */ fun launchSecondaryActivity(wmHelper: WindowManagerStateHelper) { - val launchButton = - uiDevice.wait( - Until.findObject(By.res(getPackage(), "launch_secondary_activity_button")), - FIND_TIMEOUT - ) - require(launchButton != null) { "Can't find launch secondary activity button on screen." } - launchButton.click() - wmHelper - .StateSyncBuilder() - .withActivityState(SECONDARY_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) - .withActivityState(MAIN_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) - .waitForAndVerify() + launchSecondaryActivityFromButton(wmHelper, "launch_secondary_activity_button") + } + + /** + * Clicks the button to launch the secondary activity in RTL, which should split with the main + * activity based on the split pair rule. + */ + fun launchSecondaryActivityRTL(wmHelper: WindowManagerStateHelper) { + launchSecondaryActivityFromButton(wmHelper, "launch_secondary_activity_rtl_button") + } + + /** + * Clicks the button to launch the secondary activity in a horizontal split. + */ + fun launchSecondaryActivityHorizontally(wmHelper: WindowManagerStateHelper) { + launchSecondaryActivityFromButton(wmHelper, "launch_secondary_activity_horizontally_button") } /** Clicks the button to launch a third activity over a secondary activity. */ @@ -101,16 +105,38 @@ constructor( */ fun finishSecondaryActivity(wmHelper: WindowManagerStateHelper) { val finishButton = - uiDevice.wait( - Until.findObject(By.res(getPackage(), "finish_secondary_activity_button")), - FIND_TIMEOUT - ) + uiDevice.wait( + Until.findObject(By.res(getPackage(), "finish_secondary_activity_button")), + FIND_TIMEOUT + ) require(finishButton != null) { "Can't find finish secondary activity button on screen." } finishButton.click() wmHelper - .StateSyncBuilder() - .withActivityRemoved(SECONDARY_ACTIVITY_COMPONENT) - .waitForAndVerify() + .StateSyncBuilder() + .withActivityRemoved(SECONDARY_ACTIVITY_COMPONENT) + .waitForAndVerify() + } + + /** + * Clicks the button to toggle the split ratio of secondary activity. + */ + fun changeSecondaryActivityRatio(wmHelper: WindowManagerStateHelper) { + val launchButton = + uiDevice.wait( + Until.findObject( + By.res(getPackage(), + "toggle_split_ratio_button")), + FIND_TIMEOUT + ) + require(launchButton != null) { + "Can't find toggle ratio for secondary activity button on screen." + } + launchButton.click() + wmHelper + .StateSyncBuilder() + .withAppTransitionIdle() + .withTransitionSnapshotGone() + .waitForAndVerify() } fun secondaryActivityEnterPip(wmHelper: WindowManagerStateHelper) { @@ -149,25 +175,19 @@ constructor( .waitForAndVerify() } - /** - * Clicks the button to launch the secondary activity in RTL, which should split with the main - * activity based on the split pair rule. - */ - fun launchSecondaryActivityRTL(wmHelper: WindowManagerStateHelper) { + private fun launchSecondaryActivityFromButton( + wmHelper: WindowManagerStateHelper, buttonName: String) { val launchButton = - uiDevice.wait( - Until.findObject(By.res(getPackage(), "launch_secondary_activity_rtl_button")), - FIND_TIMEOUT - ) + uiDevice.wait(Until.findObject(By.res(getPackage(), buttonName)), FIND_TIMEOUT) require(launchButton != null) { - "Can't find launch secondary activity rtl button on screen." + "Can't find launch secondary activity button : " + buttonName + "on screen." } launchButton.click() wmHelper - .StateSyncBuilder() - .withActivityState(SECONDARY_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) - .withActivityState(MAIN_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) - .waitForAndVerify() + .StateSyncBuilder() + .withActivityState(SECONDARY_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) + .withActivityState(MAIN_ACTIVITY_COMPONENT, PlatformConsts.STATE_RESUMED) + .waitForAndVerify() } /** diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt index 94b090f42c9b..063e2c3091ca 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromLockscreenViaIntentTest.kt @@ -71,7 +71,7 @@ open class OpenAppFromLockscreenViaIntentTest(flicker: LegacyFlickerTest) : * Checks that the [ComponentNameMatcher.NAV_BAR] layer starts invisible, becomes visible during * unlocking animation and remains visible at the end */ - @Presubmit + @FlakyTest(bugId = 288341660) @Test fun navBarLayerVisibilityChanges() { Assume.assumeFalse(flicker.scenario.isTablet) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/notification/OpenAppFromNotificationWarmTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/notification/OpenAppFromNotificationWarmTest.kt index a6cf8eebf063..0e33390353e9 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/notification/OpenAppFromNotificationWarmTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/notification/OpenAppFromNotificationWarmTest.kt @@ -67,7 +67,10 @@ open class OpenAppFromNotificationWarmTest(flicker: LegacyFlickerTest) : wmHelper.StateSyncBuilder().withFullScreenApp(testApp).waitForAndVerify() testApp.postNotification(wmHelper) device.pressHome() - wmHelper.StateSyncBuilder().withHomeActivityVisible().waitForAndVerify() + wmHelper.StateSyncBuilder() + .withHomeActivityVisible() + .withWindowSurfaceDisappeared(ComponentNameMatcher.NOTIFICATION_SHADE) + .waitForAndVerify() } transitions { diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/service/Utils.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/service/Utils.kt index 8242e9a31992..276f97962d7f 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/service/Utils.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/service/Utils.kt @@ -22,9 +22,7 @@ import android.platform.test.rule.PressHomeRule import android.platform.test.rule.UnlockScreenRule import android.tools.common.NavBar import android.tools.common.Rotation -import android.tools.device.apphelpers.MessagingAppHelper import android.tools.device.flicker.rules.ChangeDisplayOrientationRule -import android.tools.device.flicker.rules.LaunchAppRule import android.tools.device.flicker.rules.RemoveAllTasksButHomeRule import androidx.test.platform.app.InstrumentationRegistry import org.junit.rules.RuleChain @@ -37,9 +35,6 @@ object Utils { .around( NavigationModeRule(navigationMode.value, /* changeNavigationModeAfterTest */ false) ) - .around( - LaunchAppRule(MessagingAppHelper(instrumentation), clearCacheAfterParsing = false) - ) .around(RemoveAllTasksButHomeRule()) .around( ChangeDisplayOrientationRule( diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml index e32a7092bf5d..86c21906163f 100644 --- a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_main_layout.xml @@ -38,6 +38,14 @@ android:text="Launch Secondary Activity in RTL" /> <Button + android:id="@+id/launch_secondary_activity_horizontally_button" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:onClick="launchSecondaryActivity" + android:tag="BOTTOM_TO_TOP" + android:text="Launch Secondary Activity Horizontally" /> + + <Button android:id="@+id/launch_placeholder_split_button" android:layout_width="wrap_content" android:layout_height="48dp" diff --git a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_secondary_activity_layout.xml b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_secondary_activity_layout.xml index 135140aa2377..6d4de995bd73 100644 --- a/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_secondary_activity_layout.xml +++ b/tests/FlickerTests/test-apps/flickerapp/res/layout/activity_embedding_secondary_activity_layout.xml @@ -35,6 +35,14 @@ android:onClick="launchThirdActivity" android:text="Launch a third activity" /> + <ToggleButton + android:id="@+id/toggle_split_ratio_button" + android:layout_width="wrap_content" + android:layout_height="48dp" + android:textOn="Ratio 0.5" + android:textOff="Ratio 0.3" + android:checked="false" /> + <Button android:id="@+id/secondary_enter_pip_button" android:layout_width="wrap_content" diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingMainActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingMainActivity.java index 3b1a8599f3e1..23fa91c37728 100644 --- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingMainActivity.java +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingMainActivity.java @@ -22,6 +22,7 @@ import android.content.Intent; import android.os.Bundle; import android.view.View; +import androidx.annotation.NonNull; import androidx.window.embedding.ActivityFilter; import androidx.window.embedding.ActivityRule; import androidx.window.embedding.EmbeddingAspectRatio; @@ -152,6 +153,9 @@ public class ActivityEmbeddingMainActivity extends Activity { if (layoutDirectionStr.equals(LayoutDirection.LEFT_TO_RIGHT.toString())) { return LayoutDirection.LEFT_TO_RIGHT; } + if (layoutDirectionStr.equals(LayoutDirection.BOTTOM_TO_TOP.toString())) { + return LayoutDirection.BOTTOM_TO_TOP; + } if (layoutDirectionStr.equals(LayoutDirection.RIGHT_TO_LEFT.toString())) { return LayoutDirection.RIGHT_TO_LEFT; } diff --git a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingSecondaryActivity.java b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingSecondaryActivity.java index ee087ef9be2c..29cbf01dc6da 100644 --- a/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingSecondaryActivity.java +++ b/tests/FlickerTests/test-apps/flickerapp/src/com/android/server/wm/flicker/testapp/ActivityEmbeddingSecondaryActivity.java @@ -22,6 +22,11 @@ import android.app.PictureInPictureParams; import android.graphics.Color; import android.os.Bundle; import android.view.View; +import android.widget.ToggleButton; + +import androidx.window.embedding.SplitAttributes; +import androidx.window.embedding.SplitAttributesCalculatorParams; +import androidx.window.embedding.SplitController; /** * Activity to be used as the secondary activity to split with @@ -29,18 +34,41 @@ import android.view.View; */ public class ActivityEmbeddingSecondaryActivity extends Activity { + private SplitController mSplitController; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_embedding_secondary_activity_layout); findViewById(R.id.secondary_activity_layout).setBackgroundColor(Color.YELLOW); findViewById(R.id.finish_secondary_activity_button).setOnClickListener( - new View.OnClickListener() { + new View.OnClickListener() { @Override public void onClick(View v) { finish(); } - }); + }); + mSplitController = SplitController.getInstance(this); + final ToggleButton splitRatio = findViewById(R.id.toggle_split_ratio_button); + mSplitController.setSplitAttributesCalculator(params -> { + return new SplitAttributes.Builder() + .setSplitType( + SplitAttributes.SplitType.ratio( + splitRatio.isChecked() ? 0.7f : 0.5f) + ) + .setLayoutDirection( + params.getDefaultSplitAttributes() + .getLayoutDirection()) + .build(); + }); + splitRatio.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + // This triggers a recalcuation of splitatributes. + mSplitController.invalidateTopVisibleSplitAttributes(); + } + }); findViewById(R.id.secondary_enter_pip_button).setOnClickListener( new View.OnClickListener() { @Override diff --git a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt index 7cf69b7780d9..31ea8327c2b3 100644 --- a/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt +++ b/tests/SilkFX/src/com/android/test/silkfx/hdr/GainmapImage.kt @@ -16,6 +16,10 @@ package com.android.test.silkfx.hdr +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.animation.ValueAnimator.AnimatorUpdateListener import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas @@ -65,15 +69,9 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context findViewById<RadioGroup>(R.id.output_mode)!!.also { it.check(outputMode) it.setOnCheckedChangeListener { _, checkedId -> - val previousMode = outputMode outputMode = checkedId - if (previousMode == R.id.output_sdr && checkedId == R.id.output_hdr) { - animateToHdr() - } else if (previousMode == R.id.output_hdr && checkedId == R.id.output_sdr) { - animateToSdr() - } else { - updateDisplay() - } + // Intentionally don't do anything fancy so that mode A/B comparisons are easy + updateDisplay() } } @@ -103,10 +101,41 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context imageView.apply { isClickable = true + // Example of animating between SDR and HDR using gainmap params; animates HDR->SDR->HDR + // with a brief pause on SDR. The key thing here is that the gainmap's + // minDisplayRatioForHdrTransition is animated between its original value (for full HDR) + // and displayRatioForFullHdr (for full SDR). The view must also be invalidated during + // the animation for the updates to take effect. setOnClickListener { - animate().alpha(.5f).withEndAction { - animate().alpha(1f).start() - }.start() + if (gainmap != null && (outputMode == R.id.output_hdr || + outputMode == R.id.output_hdr_test)) { + val animationLengthMs: Long = 500 + val updateListener = object : AnimatorUpdateListener { + override fun onAnimationUpdate(animation: ValueAnimator) { + imageView.invalidate() + } + } + val hdrToSdr = ObjectAnimator.ofFloat( + gainmap, "minDisplayRatioForHdrTransition", + gainmap!!.minDisplayRatioForHdrTransition, + gainmap!!.displayRatioForFullHdr).apply { + duration = animationLengthMs + addUpdateListener(updateListener) + } + val sdrToHdr = ObjectAnimator.ofFloat( + gainmap, "minDisplayRatioForHdrTransition", + gainmap!!.displayRatioForFullHdr, + gainmap!!.minDisplayRatioForHdrTransition).apply { + duration = animationLengthMs + addUpdateListener(updateListener) + } + + AnimatorSet().apply { + play(hdrToSdr) + play(sdrToHdr).after(animationLengthMs) + start() + } + } } } } @@ -164,20 +193,6 @@ class GainmapImage(context: Context, attrs: AttributeSet?) : FrameLayout(context updateDisplay() } - private fun animateToHdr() { - if (bitmap == null || gainmap == null) return - - // TODO: Trigger an animation - updateDisplay() - } - - private fun animateToSdr() { - if (bitmap == null) return - - // TODO: Trigger an animation - updateDisplay() - } - private fun updateDisplay() { if (bitmap == null) return diff --git a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java index fa5b7c15a6fe..ba9e4a831789 100644 --- a/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java +++ b/tests/UpdatableSystemFontTest/src/com/android/updatablesystemfont/UpdatableSystemFontTest.java @@ -24,7 +24,6 @@ import static android.os.ParcelFileDescriptor.MODE_READ_ONLY; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; -import static org.junit.Assume.assumeTrue; import static java.util.concurrent.TimeUnit.SECONDS; @@ -36,7 +35,6 @@ import android.graphics.fonts.FontManager; import android.graphics.fonts.FontStyle; import android.os.ParcelFileDescriptor; import android.platform.test.annotations.RootPermissionTest; -import android.security.FileIntegrityManager; import android.text.FontConfig; import android.util.Log; import android.util.Pair; @@ -139,10 +137,6 @@ public class UpdatableSystemFontTest { @Before public void setUp() throws Exception { Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); - // Run tests only if updatable system font is enabled. - FileIntegrityManager fim = context.getSystemService(FileIntegrityManager.class); - assumeTrue(fim != null); - assumeTrue(fim.isApkVeritySupported()); mKeyId = insertCert(CERT_PATH); mFontManager = context.getSystemService(FontManager.class); expectCommandToSucceed("cmd font clear"); |