Fix carrier name animation during qqs expand

The bug is a result of two recent changes: ag/20943168 and ag/22645423.

The fix is very simple and sets the startPadding of the carrier group to the max width of the clock (when fully scaled) no matter the actual scale of the clock. As a result, the carrier group will never overlap the clock and it will also not move during the qqs expand animation. Since the collapsed state of the combined_qs_header is only there for animation purposes (as far as I understand) and is always faded out when collapsed, this change should not have any negative effects.

Bug: 280016031
Test: atest ShadeHeaderControllerTest, Manual, i.e. testing the qqs expand and collapse animation with no carrier, one carrier, multiple carriers and rtl.
Change-Id: Ie4745bd466fb1a24dcd47d6f85c545764d6c8662
This commit is contained in:
Johannes Gallmann
2023-05-31 14:00:16 +02:00
parent 3816d9b959
commit c6f219e7b2
4 changed files with 28 additions and 15 deletions

View File

@@ -572,6 +572,7 @@
<dimen name="qs_brightness_margin_bottom">16dp</dimen>
<dimen name="qqs_layout_margin_top">16dp</dimen>
<dimen name="qqs_layout_padding_bottom">24dp</dimen>
<item name="qqs_expand_clock_scale" format="float" type="dimen">2.57</item>
<!-- Most of the time it should be the same as notification_side_paddings as it's vertically
aligned with notifications. The exception is split shade when this value becomes

View File

@@ -43,8 +43,8 @@
app:layout_constraintBottom_toBottomOf="@id/carrier_group"
/>
<Transform
android:scaleX="2.57"
android:scaleY="2.57"
android:scaleX="@dimen/qqs_expand_clock_scale"
android:scaleY="@dimen/qqs_expand_clock_scale"
/>
</Constraint>

View File

@@ -34,6 +34,7 @@ import android.view.WindowInsets
import android.widget.TextView
import androidx.annotation.VisibleForTesting
import androidx.constraintlayout.motion.widget.MotionLayout
import androidx.core.view.doOnLayout
import com.android.app.animation.Interpolators
import com.android.settingslib.Utils
import com.android.systemui.Dumpable
@@ -220,6 +221,7 @@ constructor(
override fun demoCommands() = listOf(DemoMode.COMMAND_CLOCK)
override fun dispatchDemoCommand(command: String, args: Bundle) =
clock.dispatchDemoCommand(command, args)
override fun onDemoModeStarted() = clock.onDemoModeStarted()
override fun onDemoModeFinished() = clock.onDemoModeFinished()
}
@@ -259,6 +261,7 @@ constructor(
resources.getDimensionPixelSize(R.dimen.large_screen_shade_header_min_height)
lastInsets?.let { updateConstraintsForInsets(header, it) }
updateResources()
updateCarrierGroupPadding()
}
}
@@ -291,6 +294,7 @@ constructor(
privacyIconsController.chipVisibilityListener = chipVisibilityListener
updateVisibility()
updateTransition()
updateCarrierGroupPadding()
header.setOnApplyWindowInsetsListener(insetListener)
@@ -298,8 +302,6 @@ constructor(
val newPivot = if (v.isLayoutRtl) v.width.toFloat() else 0f
v.pivotX = newPivot
v.pivotY = v.height.toFloat() / 2
mShadeCarrierGroup.setPaddingRelative((v.width * v.scaleX).toInt(), 0, 0, 0)
}
clock.setOnClickListener { launchClockActivity() }
@@ -359,6 +361,14 @@ constructor(
.load(context, resources.getXml(R.xml.large_screen_shade_header))
}
private fun updateCarrierGroupPadding() {
clock.doOnLayout {
val maxClockWidth =
(clock.width * resources.getFloat(R.dimen.qqs_expand_clock_scale)).toInt()
mShadeCarrierGroup.setPaddingRelative(maxClockWidth, 0, 0, 0)
}
}
private fun updateConstraintsForInsets(view: MotionLayout, insets: WindowInsets) {
val cutout = insets.displayCutout.also { this.cutout = it }

View File

@@ -78,6 +78,7 @@ import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.mock
import org.mockito.Mockito.reset
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.`when` as whenever
import org.mockito.junit.MockitoJUnit
@@ -387,7 +388,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
whenever(clock.isLayoutRtl).thenReturn(false)
val captor = ArgumentCaptor.forClass(View.OnLayoutChangeListener::class.java)
verify(clock).addOnLayoutChangeListener(capture(captor))
verify(clock, times(2)).addOnLayoutChangeListener(capture(captor))
captor.value.onLayoutChange(clock, 0, 1, 2, 3, 4, 5, 6, 7)
verify(clock).pivotX = 0f
@@ -400,7 +401,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
whenever(clock.isLayoutRtl).thenReturn(true)
val captor = ArgumentCaptor.forClass(View.OnLayoutChangeListener::class.java)
verify(clock).addOnLayoutChangeListener(capture(captor))
verify(clock, times(2)).addOnLayoutChangeListener(capture(captor))
captor.value.onLayoutChange(clock, 0, 1, 2, 3, 4, 5, 6, 7)
verify(clock).pivotX = width.toFloat()
@@ -793,7 +794,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
@Test
fun clockPivotYInCenter() {
val captor = ArgumentCaptor.forClass(View.OnLayoutChangeListener::class.java)
verify(clock).addOnLayoutChangeListener(capture(captor))
verify(clock, times(2)).addOnLayoutChangeListener(capture(captor))
var height = 100
val width = 50
@@ -825,16 +826,17 @@ class ShadeHeaderControllerTest : SysuiTestCase() {
}
@Test
fun carrierLeftPaddingIsSetWhenClockLayoutChanges() {
val width = 200
whenever(clock.width).thenReturn(width)
whenever(clock.scaleX).thenReturn(2.57f) // 2.57 comes from qs_header.xml
fun carrierStartPaddingIsSetOnClockLayout() {
val clockWidth = 200
val maxClockScale = context.resources.getFloat(R.dimen.qqs_expand_clock_scale)
val expectedStartPadding = (clockWidth * maxClockScale).toInt()
whenever(clock.width).thenReturn(clockWidth)
val captor = ArgumentCaptor.forClass(View.OnLayoutChangeListener::class.java)
verify(clock, times(2)).addOnLayoutChangeListener(capture(captor))
captor.allValues.forEach { clock.executeLayoutChange(0, 0, clockWidth, 0, it) }
verify(clock).addOnLayoutChangeListener(capture(captor))
captor.value.onLayoutChange(clock, 0, 0, width, 0, 0, 0, 0, 0)
verify(carrierGroup).setPaddingRelative(514, 0, 0, 0)
verify(carrierGroup).setPaddingRelative(expectedStartPadding, 0, 0, 0)
}
@Test