diff options
2 files changed, 202 insertions, 26 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt index 87abd0a4494a..256da253588c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationShelfTest.kt @@ -22,6 +22,7 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntry import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.ExpandableView import com.android.systemui.statusbar.notification.shared.NotificationMinimalism +import com.android.systemui.statusbar.notification.shelf.NotificationShelfIconContainer import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm.StackScrollAlgorithmState import com.android.systemui.util.mockito.mock import junit.framework.Assert.assertEquals @@ -134,89 +135,208 @@ open class NotificationShelfTest : SysuiTestCase() { @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testAlignment_splitShade_LTR() { // Given: LTR mode, split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) // Then: shelf should align to end assertTrue(shelfSpy.isAlignedToEnd) assertTrue(shelfSpy.isAlignedToRight) assertTrue(shelfSpy.mBackgroundNormal.alignToEnd) - assertTrue(shelfSpy.mShelfIcons.alignToEnd) + + // Then: icon container should align to end, right + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertTrue(iconContainer.alignToEnd) + assertTrue(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = width - actualWidth + actualPaddingStart + val expectedRightBound = width - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testAlignment_nonSplitShade_LTR() { // Given: LTR mode, non split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) // Then: shelf should not align to end + // left bound of icon container should be 16f (actualPaddingStart) + // right bound of icon container should be 24f (actualWidth - actualPaddingEnd) assertFalse(shelfSpy.isAlignedToEnd) assertFalse(shelfSpy.isAlignedToRight) assertFalse(shelfSpy.mBackgroundNormal.alignToEnd) - assertFalse(shelfSpy.mShelfIcons.alignToEnd) + + // Then: icon container should align to start, left + + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertFalse(iconContainer.alignToEnd) + assertFalse(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = actualPaddingStart + val expectedRightBound = actualWidth - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testAlignment_splitShade_RTL() { // Given: RTL mode, split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) // Then: shelf should align to end, but to left due to RTL + // left bound of icon container should be 16f (actualPaddingStart) + // right bound of icon container should be 24f (actualWidth - actualPaddingEnd) assertTrue(shelfSpy.isAlignedToEnd) assertFalse(shelfSpy.isAlignedToRight) assertTrue(shelfSpy.mBackgroundNormal.alignToEnd) - assertTrue(shelfSpy.mShelfIcons.alignToEnd) + + // Then: icon container should align to end, left + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertTrue(iconContainer.alignToEnd) + assertFalse(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = actualPaddingStart + val expectedRightBound = actualWidth - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testAlignment_nonSplitShade_RTL() { // Given: RTL mode, non split shade + val width = 100 + val actualWidth = 40 + val iconContainerPadding = 16f val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + iconContainerPadding = iconContainerPadding, + ) // Then: shelf should not align to end, but to right due to RTL assertFalse(shelfSpy.isAlignedToEnd) assertTrue(shelfSpy.isAlignedToRight) assertFalse(shelfSpy.mBackgroundNormal.alignToEnd) - assertFalse(shelfSpy.mShelfIcons.alignToEnd) + + // Then: icon container should align to start, right + val iconContainer = shelfSpy.shelfIcons as NotificationShelfIconContainer + assertFalse(iconContainer.alignToEnd) + assertTrue(iconContainer.isAlignedToRight) + + // Then: icon container bounds are updated based on the widths and paddings + val actualPaddingStart = iconContainerPadding + val actualPaddingEnd = iconContainerPadding + val expectedLeftBound = width - actualWidth + actualPaddingStart + val expectedRightBound = width - actualPaddingEnd + assertEquals(expectedLeftBound, iconContainer.leftBound) + assertEquals(expectedRightBound, iconContainer.rightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfLeftBound_splitShade_LTR() { // Given: LTR mode, split shade + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) // When: get the left bound of the shelf val shelfLeftBound = shelfSpy.shelfLeftBound // Then: should be equal to shelf's width - actual width - assertEquals(60f, shelfLeftBound) + val expectedLeftBound = (width - actualWidth).toFloat() + assertEquals(expectedLeftBound, shelfLeftBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfRightBound_splitShade_LTR() { // Given: LTR mode, split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) // Then: the right bound of the shelf should be equal to shelf's width - assertEquals(100f, shelfSpy.shelfRightBound) + val expectedRightBound = width.toFloat() + assertEquals(expectedRightBound, shelfSpy.shelfRightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfLeftBound_nonSplitShade_LTR() { // Given: LTR mode, non split shade + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) // When: get the left bound of the shelf val shelfLeftBound = shelfSpy.shelfLeftBound @@ -229,19 +349,35 @@ open class NotificationShelfTest : SysuiTestCase() { @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfRightBound_nonSplitShade_LTR() { // Given: LTR mode, non split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = false, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = false, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) // Then: the right bound of the shelf should be equal to shelf's actual width - assertEquals(40f, shelfSpy.shelfRightBound) + assertEquals(actualWidth.toFloat(), shelfSpy.shelfRightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfLeftBound_splitShade_RTL() { // Given: RTL mode, split shade + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) // When: get the left bound of the shelf val shelfLeftBound = shelfSpy.shelfLeftBound @@ -254,36 +390,61 @@ open class NotificationShelfTest : SysuiTestCase() { @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfRightBound_splitShade_RTL() { // Given: RTL mode, split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = true, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = true, + width = width, + actualWidth = actualWidth, + ) // Then: the right bound of the shelf should be equal to shelf's actual width - assertEquals(40f, shelfSpy.shelfRightBound) + assertEquals(actualWidth.toFloat(), shelfSpy.shelfRightBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfLeftBound_nonSplitShade_RTL() { // Given: RTL mode, non split shade + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) // When: get the left bound of the shelf val shelfLeftBound = shelfSpy.shelfLeftBound // Then: should be equal to shelf's width - actual width - assertEquals(60f, shelfLeftBound) + val expectedLeftBound = (width - actualWidth).toFloat() + assertEquals(expectedLeftBound, shelfLeftBound) } @Test @EnableFlags(NotificationMinimalism.FLAG_NAME) fun testGetShelfRightBound_nonSplitShade_RTL() { // Given: LTR mode, non split shade, width 100, actual width 40 + val width = 100 + val actualWidth = 40 val shelfSpy = - prepareShelfSpy(shelf, rtl = true, splitShade = false, width = 100, actualWidth = 40) + prepareShelfSpy( + shelf, + rtl = true, + splitShade = false, + width = width, + actualWidth = actualWidth, + ) // Then: the right bound of the shelf should be equal to shelf's width - assertEquals(100f, shelfSpy.shelfRightBound) + assertEquals(width.toFloat(), shelfSpy.shelfRightBound) } private fun prepareShelfSpy( @@ -292,12 +453,23 @@ open class NotificationShelfTest : SysuiTestCase() { splitShade: Boolean, width: Int, actualWidth: Int, + iconContainerPadding: Float? = null, ): NotificationShelf { val shelfSpy = spy(shelf) whenever(shelfSpy.isLayoutRtl).thenReturn(rtl) whenever(ambientState.useSplitShade).thenReturn(splitShade) - whenever(shelfSpy.width).thenReturn(width) + shelfSpy.layout(0, 0, width, 5) + shelfSpy.mShelfIcons.layout(0, 0, width, 5) + iconContainerPadding?.let { + shelfSpy.mShelfIcons.actualPaddingStart = it + shelfSpy.mShelfIcons.setActualPaddingEnd(it) + } shelfSpy.setActualWidth(actualWidth.toFloat()) + + val iconContainerSpy = spy(shelf.mShelfIcons) + whenever(iconContainerSpy.isLayoutRtl).thenReturn(rtl) + whenever(shelfSpy.shelfIcons).thenReturn(iconContainerSpy) + return shelfSpy } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt index 64d165402759..5106cccc1755 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/NotificationShelfIconContainer.kt @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.notification.shelf import android.content.Context import android.util.AttributeSet import android.view.View +import com.android.internal.annotations.VisibleForTesting import com.android.systemui.statusbar.notification.shared.NotificationMinimalism import com.android.systemui.statusbar.phone.NotificationIconContainer import kotlin.math.max @@ -35,7 +36,8 @@ constructor(context: Context, attrs: AttributeSet? = null) : /** * @return The left boundary (not the RTL compatible start) of the area that icons can be added. */ - override fun getLeftBound(): Float { + @VisibleForTesting + public override fun getLeftBound(): Float { if (!NotificationMinimalism.isEnabled) { return super.getLeftBound() } @@ -49,7 +51,8 @@ constructor(context: Context, attrs: AttributeSet? = null) : /** * @return The right boundary (not the RTL compatible end) of the area that icons can be added. */ - override fun getRightBound(): Float { + @VisibleForTesting + public override fun getRightBound(): Float { if (!NotificationMinimalism.isEnabled) { return super.getRightBound() } @@ -80,7 +83,8 @@ constructor(context: Context, attrs: AttributeSet? = null) : return actualWidth - iconState.xTranslation - iconView.width } - private val isAlignedToRight: Boolean + @VisibleForTesting + val isAlignedToRight: Boolean get() { if (!NotificationMinimalism.isEnabled) { return isLayoutRtl |