Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7838f534 authored by Selim Cinek's avatar Selim Cinek
Browse files

Fix flickering of min priority notification icons

The previous logic was looking at making the dots hidden at the
state calculation level based on a state that would only be
updated later in the phase. This lead to icons flickering to
visible and hidden in a reproducible manner.
We now instead use the values during the state calculation to
hide the right icons and only have the last dot visible.

Fixes: 402752618
Test: atest SystemUITests
Flag: com.android.systemui.physical_notification_movement
Change-Id: Ife69d09a770f7fa0cd050dc5e1728d0113b13f6f
parent 5f776e72
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -15,10 +15,14 @@
 */
package com.android.systemui.statusbar.phone

import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
import android.service.notification.StatusBarNotification
import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.statusbar.StatusBarIconView
import com.android.systemui.statusbar.StatusBarIconView.STATE_DOT
@@ -26,6 +30,7 @@ import com.android.systemui.statusbar.StatusBarIconView.STATE_HIDDEN
import junit.framework.Assert.assertEquals
import junit.framework.Assert.assertFalse
import junit.framework.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito.mock
@@ -37,6 +42,8 @@ import org.mockito.Mockito.`when` as whenever
@RunWithLooper
class NotificationIconContainerTest : SysuiTestCase() {

    @get:Rule
    val setFlagsRule = SetFlagsRule()
    private val iconContainer = NotificationIconContainer(context, /* attrs= */ null)

    @Test
@@ -174,6 +181,7 @@ class NotificationIconContainerTest : SysuiTestCase() {
    }

    @Test
    @EnableFlags(Flags.FLAG_PHYSICAL_NOTIFICATION_MOVEMENT)
    fun calculateIconXTranslations_givenWidthNotEnoughForFourIcons_atCorrectXWithOverflowDot() {
        iconContainer.setActualPaddingStart(0f)
        iconContainer.setActualPaddingEnd(0f)
@@ -191,6 +199,34 @@ class NotificationIconContainerTest : SysuiTestCase() {
        iconContainer.addView(iconFour)
        assertEquals(4, iconContainer.childCount)

        iconContainer.calculateIconXTranslations()
        assertEquals(0f, iconContainer.getIconState(iconOne).xTranslation)
        assertEquals(10f, iconContainer.getIconState(iconTwo).xTranslation)
        assertEquals(STATE_HIDDEN, iconContainer.getIconState(iconThree).visibleState)
        assertEquals(STATE_DOT, iconContainer.getIconState(iconFour).visibleState)
        assertTrue(iconContainer.areIconsOverflowing())
    }


    @Test
    @DisableFlags(Flags.FLAG_PHYSICAL_NOTIFICATION_MOVEMENT)
    fun calculateIconXTranslations_givenWidthNotEnoughForFourIcons_atCorrectXWithOverflowDotNonPhysical() {
        iconContainer.setActualPaddingStart(0f)
        iconContainer.setActualPaddingEnd(0f)
        iconContainer.setActualLayoutWidth(35)
        iconContainer.setIconSize(10)

        val iconOne = mockStatusBarIcon()
        val iconTwo = mockStatusBarIcon()
        val iconThree = mockStatusBarIcon()
        val iconFour = mockStatusBarIcon()

        iconContainer.addView(iconOne)
        iconContainer.addView(iconTwo)
        iconContainer.addView(iconThree)
        iconContainer.addView(iconFour)
        assertEquals(4, iconContainer.childCount)

        iconContainer.calculateIconXTranslations()
        assertEquals(0f, iconContainer.getIconState(iconOne).xTranslation)
        assertEquals(10f, iconContainer.getIconState(iconTwo).xTranslation)
+2 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar;

import static com.android.keyguard.BouncerPanelExpansionCalculator.aboutToShowBouncerProgress;
import static com.android.systemui.Flags.physicalNotificationMovement;
import static com.android.systemui.util.ColorUtilKt.hexColorString;

import android.content.Context;
@@ -929,7 +930,7 @@ public class NotificationShelf extends ActivatableNotificationView {
        iconState.setAlpha(ICON_ALPHA_INTERPOLATOR.getInterpolation(transitionAmount));
        boolean isAppearing = row.isDrawingAppearAnimation() && !row.isInShelf();
        iconState.hidden = isAppearing
                || (view instanceof ExpandableNotificationRow
                || (!physicalNotificationMovement() && view instanceof ExpandableNotificationRow
                && ((ExpandableNotificationRow) view).isMinimized()
                && mShelfIcons.areIconsOverflowing())
                || (transitionAmount == 0.0f && !iconState.isAnimating(icon))
+12 −4
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */
package com.android.systemui.statusbar.phone;

import static com.android.systemui.Flags.physicalNotificationMovement;
import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DELAY;
import static com.android.systemui.statusbar.phone.HeadsUpAppearanceController.CONTENT_FADE_DURATION;

@@ -522,17 +523,24 @@ public class NotificationIconContainer extends ViewGroup {
                IconState iconState = mIconStates.get(view);
                int dotWidth = mStaticDotDiameter + mDotPadding;
                iconState.setXTranslation(translationX);
                boolean isLastChild = i == childCount - 1;
                if (!mIsShowingOverflowDot) {
                    if (iconState.iconAppearAmount < 0.8f) {
                    if (iconState.iconAppearAmount < 0.8f && (isLastChild || !physicalNotificationMovement())) {
                        iconState.visibleState = StatusBarIconView.STATE_ICON;
                    } else {
                        iconState.visibleState = StatusBarIconView.STATE_DOT;
                        iconState.visibleState = isLastChild || !physicalNotificationMovement() ?
                            StatusBarIconView.STATE_DOT:
                            StatusBarIconView.STATE_HIDDEN;
                        mIsShowingOverflowDot = true;
                    }
                    if (!physicalNotificationMovement()) {
                        translationX += dotWidth * iconState.iconAppearAmount;
                    }
                    mLastVisibleIconState = iconState;
                } else {
                    iconState.visibleState = StatusBarIconView.STATE_HIDDEN;
                    iconState.visibleState = isLastChild && physicalNotificationMovement() ?
                            StatusBarIconView.STATE_DOT:
                            StatusBarIconView.STATE_HIDDEN;
                }
            }
        } else if (childCount > 0) {