diff options
author | 2025-02-24 13:25:43 -0800 | |
---|---|---|
committer | 2025-02-24 13:25:43 -0800 | |
commit | 1dea65a15a4b29239e160277178bb64c26712db1 (patch) | |
tree | db3fabe0a84e9557b6856d3ec0080f02f0836c2c | |
parent | 0f6a916598378e5d021c170035e97176583611fd (diff) |
Skip expanded view layout updates while animating
Do not modify bubble bar expanded view layout properties while it is
animating.
This was causing problems when converting a task to a bubble.
After ag/31701472 we immediately start the animation to convert a task
to bubble. And have launcher show the bubble bar in parallel.
After launcher has shown the bubble bar, it will attempt to update the
expanded view with the latest bubble bar top coordinate.
If this happens while the convert to bubble animation is running, it
will interrupt the animation progress.
Previously it was not a problem as we were waiting for launcher to
complete its work. Before starting the convert to bubble animation.
Added a check to not update the bubble bar expanded view layout while an
animation is playing.
There is still a jump-cut at the end of animation where the size of the
expanded view gets adjusted. That will be addressed as part of animation
improvements.
Bug: 396449031
Test: atest WMShellMultivalentTestsOnDevice:com.android.wm.shell.bubbles.bar.BubbleBarLayerViewTest
Test: atest WMShellRobolectricTests:com.android.wm.shell.bubbles.bar.BubbleBarLayerViewTest
Flag: com.android.wm.shell.enable_bubble_bar
Change-Id: Ibacd56459de0b7fc0897bacc7a00f927c4590e91
2 files changed, 60 insertions, 1 deletions
diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt index 7b5831376dc0..14c15210252a 100644 --- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt +++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerViewTest.kt @@ -19,7 +19,9 @@ package com.android.wm.shell.bubbles.bar import android.animation.AnimatorTestRule import android.content.Context import android.content.pm.LauncherApps +import android.graphics.Insets import android.graphics.PointF +import android.graphics.Rect import android.os.Handler import android.os.UserManager import android.view.IWindowManager @@ -61,6 +63,7 @@ import com.android.wm.shell.common.TestShellExecutor import com.android.wm.shell.shared.TransactionPool import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils import com.android.wm.shell.shared.bubbles.BubbleBarLocation +import com.android.wm.shell.shared.bubbles.DeviceConfig import com.android.wm.shell.sysui.ShellCommandHandler import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit @@ -80,6 +83,10 @@ import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) class BubbleBarLayerViewTest { + companion object { + const val SCREEN_WIDTH = 2000 + const val SCREEN_HEIGHT = 1000 + } @get:Rule val animatorTestRule: AnimatorTestRule = AnimatorTestRule(this) @@ -111,6 +118,16 @@ class BubbleBarLayerViewTest { bubblePositioner = BubblePositioner(context, windowManager) bubblePositioner.setShowingInBubbleBar(true) + val deviceConfig = + DeviceConfig( + windowBounds = Rect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT), + isLargeScreen = true, + isSmallTablet = false, + isLandscape = true, + isRtl = false, + insets = Insets.of(10, 20, 30, 40) + ) + bubblePositioner.update(deviceConfig) testBubblesList = mutableListOf() val bubbleData = mock<BubbleData>() @@ -313,6 +330,48 @@ class BubbleBarLayerViewTest { assertThat(uiEventLoggerFake.logs[0]).hasBubbleInfo(bubble) } + @Test + fun testUpdateExpandedView_updateLocation() { + bubblePositioner.bubbleBarLocation = BubbleBarLocation.RIGHT + val bubble = createBubble("first") + + getInstrumentation().runOnMainSync { + bubbleBarLayerView.showExpandedView(bubble) + } + waitForExpandedViewAnimation() + + val previousX = bubble.bubbleBarExpandedView!!.x + + bubblePositioner.bubbleBarLocation = BubbleBarLocation.LEFT + getInstrumentation().runOnMainSync { + bubbleBarLayerView.updateExpandedView() + } + + assertThat(bubble.bubbleBarExpandedView!!.x).isNotEqualTo(previousX) + } + + @Test + fun testUpdatedExpandedView_updateLocation_skipWhileAnimating() { + bubblePositioner.bubbleBarLocation = BubbleBarLocation.RIGHT + val bubble = createBubble("first") + + getInstrumentation().runOnMainSync { + bubbleBarLayerView.showExpandedView(bubble) + } + waitForExpandedViewAnimation() + + val previousX = bubble.bubbleBarExpandedView!!.x + bubble.bubbleBarExpandedView!!.isAnimating = true + + bubblePositioner.bubbleBarLocation = BubbleBarLocation.LEFT + getInstrumentation().runOnMainSync { + bubbleBarLayerView.updateExpandedView() + } + + // Expanded view is not updated while animating + assertThat(bubble.bubbleBarExpandedView!!.x).isEqualTo(previousX) + } + private fun createBubble(key: String): Bubble { val bubbleTaskView = FakeBubbleTaskViewFactory(context, mainExecutor).create() val bubbleBarExpandedView = diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java index e3b0872df593..37ca96580edc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/bar/BubbleBarLayerView.java @@ -472,7 +472,7 @@ public class BubbleBarLayerView extends FrameLayout /** Updates the expanded view size and position. */ public void updateExpandedView() { - if (mExpandedView == null || mExpandedBubble == null) return; + if (mExpandedView == null || mExpandedBubble == null || mExpandedView.isAnimating()) return; boolean isOverflowExpanded = mExpandedBubble.getKey().equals(BubbleOverflow.KEY); mPositioner.getBubbleBarExpandedViewBounds(mPositioner.isBubbleBarOnLeft(), isOverflowExpanded, mTempRect); |