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

Commit 1bdf26ef authored by Fabián Kozynski's avatar Fabián Kozynski
Browse files

Use setQsExpanded to start expansion early

If isQsExpanded is true, it means that we are either in QS or expanding
to QS. In that case, have a minimum for the expansion value of 1e-5 so
compose will start expanding things and listening in QS. This causes
listening to trigger one frame earlier in the CUJ.

We only do this for the purposes of STL. For listening in QS, we wait
for the expansion to be greater than this.

Test: manual, perfetto
Test: atest QSFragmentComposeViewModelTest
Flag: com.android.systemui.qs_compose_fragment_early_expansion
Bug: 414856236

Change-Id: I7096693f517f91659fc27c335f87579733f2e13f
parent 90f7051e
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -19,9 +19,12 @@ package com.android.systemui.qs.composefragment.viewmodel
import android.app.StatusBarManager
import android.content.testableContext
import android.graphics.Rect
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.testing.TestableLooper.RunWithLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.Flags.FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.testScope
@@ -473,6 +476,30 @@ class QSFragmentComposeViewModelTest : AbstractQSFragmentComposeViewModelTest()
            }
        }

    @Test
    @DisableFlags(FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION)
    fun minExpansion_expanded_noEarlyExpansion() =
        with(kosmos) {
            testScope.testWithinLifecycle {
                underTest.isQsExpanded = true
                underTest.setQsExpansionValue(0f)

                assertThat(underTest.expansionState.progress).isEqualTo(0f)
            }
        }

    @Test
    @EnableFlags(FLAG_QS_COMPOSE_FRAGMENT_EARLY_EXPANSION)
    fun minExpansion_expanded_earlyExpansion() =
        with(kosmos) {
            testScope.testWithinLifecycle {
                underTest.isQsExpanded = true
                underTest.setQsExpansionValue(0f)

                assertThat(underTest.expansionState.progress).isGreaterThan(0f)
            }
        }

    private fun TestScope.setMediaState(state: MediaState) {
        with(kosmos) {
            val activeMedia = state == ACTIVE_MEDIA
+2 −1
Original line number Diff line number Diff line
@@ -839,7 +839,8 @@ constructor(
                                                    derivedStateOf {
                                                        viewModel.isQsVisibleAndAnyShadeExpanded &&
                                                            viewModel.expansionState.progress >
                                                                0f &&
                                                                QSFragmentComposeViewModel
                                                                    .QS_LISTENING_THRESHOLD &&
                                                            !viewModel.isEditing
                                                    }
                                                }
+10 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.app.tracing.coroutines.launchTraced as launch
import com.android.internal.logging.UiEventLogger
import com.android.keyguard.BouncerPanelExpansionCalculator
import com.android.systemui.Dumpable
import com.android.systemui.Flags.qsComposeFragmentEarlyExpansion
import com.android.systemui.animation.ShadeInterpolation
import com.android.systemui.classifier.Classifier
import com.android.systemui.classifier.domain.interactor.FalsingInteractor
@@ -215,7 +216,7 @@ constructor(
        if (forceQs) {
            QSExpansionState(1f)
        } else {
            QSExpansionState(qsExpansion.coerceIn(0f, 1f))
            QSExpansionState(qsExpansion.coerceIn(if (isQsExpanded) EARLY_EXPANSION else 0f, 1f))
        }
    }

@@ -587,6 +588,14 @@ constructor(

    // In the future, this may have other relevant elements.
    data class QSExpansionState(@FloatRange(0.0, 1.0) val progress: Float)

    companion object {
        private val EARLY_EXPANSION
            get() = if (qsComposeFragmentEarlyExpansion()) 1.0E-6F else 0f

        val QS_LISTENING_THRESHOLD
            get() = EARLY_EXPANSION * 2
    }
}

private fun Float.constrainSquishiness(): Float {
+16 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.systemui.shade;

import static android.view.WindowInsets.Type.ime;

import static com.android.systemui.Flags.qsComposeFragmentEarlyExpansion;
import static com.android.systemui.classifier.Classifier.QS_COLLAPSE;
import static com.android.systemui.shade.NotificationPanelViewController.COUNTER_PANEL_OPEN_QS;
import static com.android.systemui.shade.NotificationPanelViewController.FLING_COLLAPSE;
@@ -1659,6 +1660,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
            mInitialHeightOnTouch = mExpansionHeight;
            mInitialTouchY = event.getY();
            mInitialTouchX = event.getX();
            if (qsComposeFragmentEarlyExpansion() && mQs != null) {
                mQs.setExpanded(true);
            }
        }
        if (!isFullyCollapsed && !isShadeOrQsHeightAnimationRunning) {
            handleDown(event);
@@ -1677,6 +1681,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
        }
        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
            mConflictingExpansionGesture = false;
            if (qsComposeFragmentEarlyExpansion()) {
                updateQsState();
            }
        }
        if (action == MotionEvent.ACTION_DOWN && isFullyCollapsed && isExpansionEnabled()) {
            mTwoFingerExpandPossible = true;
@@ -1745,6 +1752,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
                mInitialHeightOnTouch = mExpansionHeight;
                initVelocityTracker();
                trackMovement(event);
                if (qsComposeFragmentEarlyExpansion() && mQs != null) {
                    mQs.setExpanded(true);
                }
                break;

            case MotionEvent.ACTION_POINTER_UP:
@@ -1782,6 +1792,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
                    flingQsWithCurrentVelocity(y,
                            event.getActionMasked() == MotionEvent.ACTION_CANCEL);
                } else {
                    if (qsComposeFragmentEarlyExpansion()) {
                        updateQsState();
                    }
                    traceQsJank(false,
                            event.getActionMasked() == MotionEvent.ACTION_CANCEL);
                }
@@ -1867,6 +1880,9 @@ public class QuickSettingsControllerImpl implements QuickSettingsController, Dum
                    mInitialTouchY = y;
                    mInitialTouchX = x;
                    mNotificationStackScrollLayoutController.cancelLongPress();
                    if (qsComposeFragmentEarlyExpansion() && mQs != null) {
                        mQs.setExpanded(true);
                    }
                    return true;
                } else {
                    mShadeLog.logQsTrackingNotStarted(mInitialTouchY, y, h, touchSlop,