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

Commit 5aa3adcf authored by Fabian Kozynski's avatar Fabian Kozynski Committed by Android (Google) Code Review
Browse files

Merge changes Ica8c048f,I2e071ba9,Ia12f4654 into main

* changes:
  [Flexiglass] Support media in landscape QQS
  Apply squishiness and expansion outside of composition
  [Flexiglass] Fix QS AndroidView
parents b2d5ed95 d2269780
Loading
Loading
Loading
Loading
+28 −9
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@

package com.android.systemui.qs.ui.composable

import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
@@ -24,6 +26,7 @@ import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.drawWithContent
import androidx.compose.ui.layout.layout
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.viewinterop.AndroidView
@@ -164,11 +167,8 @@ private fun QuickSettingsContent(
    state: () -> QSSceneAdapter.State,
    modifier: Modifier = Modifier,
) {
    val qsView by qsSceneAdapter.qsView.collectAsStateWithLifecycle(null)
    val isCustomizing by
        qsSceneAdapter.isCustomizerShowing.collectAsStateWithLifecycle(
            qsSceneAdapter.isCustomizerShowing.value
        )
    val qsView by qsSceneAdapter.qsView.collectAsStateWithLifecycle()
    val isCustomizing by qsSceneAdapter.isCustomizerShowing.collectAsStateWithLifecycle()
    QuickSettingsTheme {
        val context = LocalContext.current

@@ -180,15 +180,34 @@ private fun QuickSettingsContent(
        qsView?.let { view ->
            Box(
                modifier =
                    modifier.fillMaxWidth().thenIf(isCustomizing) { Modifier.fillMaxHeight() }
                    modifier
                        .fillMaxWidth()
                        .thenIf(isCustomizing) { Modifier.fillMaxHeight() }
                        .drawWithContent {
                            qsSceneAdapter.applyLatestExpansionAndSquishiness()
                            drawContent()
                        }
            ) {
                AndroidView(
                    modifier = Modifier.fillMaxWidth(),
                    factory = { _ ->
                    factory = { context ->
                        qsSceneAdapter.setState(state())
                        FrameLayout(context).apply {
                            (view.parent as? ViewGroup)?.removeView(view)
                            addView(view)
                        }
                    },
                    // When the view changes (e.g. due to a theme change), this will be recomposed
                    // if needed and the new view will be attached to the FrameLayout here.
                    update = {
                        qsSceneAdapter.setState(state())
                        view
                        if (view.parent != it) {
                            it.removeAllViews()
                            (view.parent as? ViewGroup)?.removeView(view)
                            it.addView(view)
                        }
                    },
                    update = { qsSceneAdapter.setState(state()) }
                    onRelease = { it.removeAllViews() }
                )
            }
        }
+37 −13
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import androidx.compose.foundation.clickable
import androidx.compose.foundation.clipScrollableContainer
import androidx.compose.foundation.gestures.Orientation
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -42,6 +43,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
@@ -67,6 +69,7 @@ import com.android.compose.animation.scene.UserActionResult
import com.android.compose.animation.scene.animateSceneFloatAsState
import com.android.compose.modifiers.padding
import com.android.compose.modifiers.thenIf
import com.android.compose.windowsizeclass.LocalWindowSizeClass
import com.android.systemui.battery.BatteryMeterViewController
import com.android.systemui.common.ui.compose.windowinsets.CutoutLocation
import com.android.systemui.common.ui.compose.windowinsets.LocalDisplayCutout
@@ -235,6 +238,10 @@ private fun SceneScope.SingleShade(
    val shouldPunchHoleBehindScrim =
        layoutState.isTransitioningBetween(Scenes.Gone, Scenes.Shade) ||
            layoutState.isTransitioningBetween(Scenes.Lockscreen, Scenes.Shade)
    // Media is visible and we are in landscape on a small height screen
    val mediaInRow =
        isMediaVisible &&
            LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Compact

    Box(
        modifier =
@@ -274,7 +281,12 @@ private fun SceneScope.SingleShade(
                                createBatteryMeterViewController = createBatteryMeterViewController,
                                statusBarIconController = statusBarIconController,
                            )
                            Box(Modifier.element(QuickSettings.Elements.QuickQuickSettings)) {

                            val content: @Composable (Modifier) -> Unit = { modifier ->
                                Box(
                                    Modifier.element(QuickSettings.Elements.QuickQuickSettings)
                                        .then(modifier)
                                ) {
                                    QuickSettings(
                                        viewModel.qsSceneAdapter,
                                        { viewModel.qsSceneAdapter.qqsHeight },
@@ -286,10 +298,22 @@ private fun SceneScope.SingleShade(
                                MediaCarousel(
                                    isVisible = isMediaVisible,
                                    mediaHost = mediaHost,
                                modifier = Modifier.fillMaxWidth(),
                                    modifier = Modifier.fillMaxWidth().then(modifier),
                                    carouselController = mediaCarouselController,
                                )
                            }

                            if (!mediaInRow) {
                                content(Modifier)
                            } else {
                                Row(
                                    modifier = Modifier.fillMaxWidth(),
                                    horizontalArrangement = spacedBy(16.dp),
                                    verticalAlignment = Alignment.CenterVertically,
                                ) {
                                    content(Modifier.weight(1f))
                                }
                            }
                            Spacer(modifier = Modifier.height(16.dp))
                        }
                    },
+72 −25
Original line number Diff line number Diff line
@@ -54,9 +54,11 @@ import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyFloat
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.inOrder
import org.mockito.Mockito.never
import org.mockito.Mockito.verify

@SmallTest
@@ -162,16 +164,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {

            with(qsImpl!!) {
                verify(this).setQsVisible(false)
                verify(this)
                verify(this, never())
                    .setQsExpansion(
                        /* expansion= */ anyFloat(),
                        /* panelExpansionFraction= */ anyFloat(),
                        /* proposedTranslation= */ anyFloat(),
                        /* squishinessFraction= */ anyFloat(),
                    )
                verify(this).setListening(false)
                verify(this).setExpanded(false)
            }

            underTest.applyLatestExpansionAndSquishiness()
            verify(qsImpl!!)
                .setQsExpansion(
                    /* expansion= */ 0f,
                    /* panelExpansionFraction= */ 1f,
                    /* proposedTranslation= */ 0f,
                    /* squishinessFraction= */ 1f,
                )
                verify(this).setListening(false)
                verify(this).setExpanded(false)
            }
        }

    @Test
@@ -186,16 +197,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            underTest.setState(QSSceneAdapter.State.QQS)
            with(qsImpl!!) {
                verify(this).setQsVisible(true)
                verify(this)
                verify(this, never())
                    .setQsExpansion(
                        /* expansion= */ anyFloat(),
                        /* panelExpansionFraction= */ anyFloat(),
                        /* proposedTranslation= */ anyFloat(),
                        /* squishinessFraction= */ anyFloat(),
                    )
                verify(this).setListening(true)
                verify(this).setExpanded(false)
            }

            underTest.applyLatestExpansionAndSquishiness()
            verify(qsImpl!!)
                .setQsExpansion(
                    /* expansion= */ 0f,
                    /* panelExpansionFraction= */ 1f,
                    /* proposedTranslation= */ 0f,
                    /* squishinessFraction= */ 1f,
                )
                verify(this).setListening(true)
                verify(this).setExpanded(false)
            }
        }

    @Test
@@ -210,16 +230,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            underTest.setState(QSSceneAdapter.State.QS)
            with(qsImpl!!) {
                verify(this).setQsVisible(true)
                verify(this)
                verify(this, never())
                    .setQsExpansion(
                        /* expansion= */ anyFloat(),
                        /* panelExpansionFraction= */ anyFloat(),
                        /* proposedTranslation= */ anyFloat(),
                        /* squishinessFraction= */ anyFloat(),
                    )
                verify(this).setListening(true)
                verify(this).setExpanded(true)
            }

            underTest.applyLatestExpansionAndSquishiness()
            verify(qsImpl!!)
                .setQsExpansion(
                    /* expansion= */ 1f,
                    /* panelExpansionFraction= */ 1f,
                    /* proposedTranslation= */ 0f,
                    /* squishinessFraction= */ 1f,
                )
                verify(this).setListening(true)
                verify(this).setExpanded(true)
            }
        }

    @Test
@@ -235,16 +264,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            underTest.setState(QSSceneAdapter.State.Expanding(progress))
            with(qsImpl!!) {
                verify(this).setQsVisible(true)
                verify(this)
                verify(this, never())
                    .setQsExpansion(
                        /* expansion= */ anyFloat(),
                        /* panelExpansionFraction= */ anyFloat(),
                        /* proposedTranslation= */ anyFloat(),
                        /* squishinessFraction= */ anyFloat(),
                    )
                verify(this).setListening(true)
                verify(this).setExpanded(true)
            }

            underTest.applyLatestExpansionAndSquishiness()
            verify(qsImpl!!)
                .setQsExpansion(
                    /* expansion= */ progress,
                    /* panelExpansionFraction= */ 1f,
                    /* proposedTranslation= */ 0f,
                    /* squishinessFraction= */ 1f,
                )
                verify(this).setListening(true)
                verify(this).setExpanded(true)
            }
        }

    @Test
@@ -260,16 +298,25 @@ class QSSceneAdapterImplTest : SysuiTestCase() {
            underTest.setState(QSSceneAdapter.State.UnsquishingQQS { squishiness })
            with(qsImpl!!) {
                verify(this).setQsVisible(true)
                verify(this)
                verify(this, never())
                    .setQsExpansion(
                        /* expansion= */ anyFloat(),
                        /* panelExpansionFraction= */ anyFloat(),
                        /* proposedTranslation= */ anyFloat(),
                        /* squishinessFraction= */ anyFloat(),
                    )
                verify(this).setListening(true)
                verify(this).setExpanded(false)
            }

            underTest.applyLatestExpansionAndSquishiness()
            verify(qsImpl!!)
                .setQsExpansion(
                    /* expansion= */ 0f,
                    /* panelExpansionFraction= */ 1f,
                    /* proposedTranslation= */ 0f,
                    /* squishinessFraction= */ squishiness,
                )
                verify(this).setListening(true)
                verify(this).setExpanded(false)
            }
        }

    @Test
+10 −0
Original line number Diff line number Diff line
@@ -484,6 +484,11 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
        return changed;
    }

    @Override
    public int getMinRows() {
        return mMinRows;
    }

    @Override
    public boolean setMaxColumns(int maxColumns) {
        mMaxColumns = maxColumns;
@@ -497,6 +502,11 @@ public class PagedTileLayout extends ViewPager implements QSTileLayout {
        return changed;
    }

    @Override
    public int getMaxColumns() {
        return mMaxColumns;
    }

    /**
     * Set the amount of excess space that we gave this view compared to the actual available
     * height. This is because this view is in a scrollview.
+12 −3
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ import com.android.internal.widget.RemeasuringLinearLayout;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.logging.QSLogger;
import com.android.systemui.res.R;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.settings.brightness.BrightnessSliderController;
import com.android.systemui.tuner.TunerService;
import com.android.systemui.tuner.TunerService.Tunable;
@@ -441,7 +442,7 @@ public class QSPanel extends LinearLayout implements Tunable {
    }

    private boolean needsDynamicRowsAndColumns() {
        return true;
        return !SceneContainerFlag.isEnabled();
    }

    private void switchAllContentToParent(ViewGroup parent, QSTileLayout newLayout) {
@@ -634,8 +635,7 @@ public class QSPanel extends LinearLayout implements Tunable {
            switchAllContentToParent(newParent, mTileLayout);
            reAttachMediaHost(mediaHostView, horizontal);
            if (needsDynamicRowsAndColumns()) {
                mTileLayout.setMinRows(horizontal ? 2 : 1);
                mTileLayout.setMaxColumns(horizontal ? 2 : 4);
                setColumnRowLayout(horizontal);
            }
            updateMargins(mediaHostView);
            if (mHorizontalLinearLayout != null) {
@@ -644,6 +644,11 @@ public class QSPanel extends LinearLayout implements Tunable {
        }
    }

    void setColumnRowLayout(boolean withMedia) {
        mTileLayout.setMinRows(withMedia ? 2 : 1);
        mTileLayout.setMaxColumns(withMedia ? 2 : 4);
    }

    private void updateMargins(ViewGroup mediaHostView) {
        updateMediaHostContentMargins(mediaHostView);
        updateHorizontalLinearLayoutMargins();
@@ -736,6 +741,8 @@ public class QSPanel extends LinearLayout implements Tunable {
            return false;
        }

        int getMinRows();

        /**
         * Sets the max number of columns to show
         *
@@ -747,6 +754,8 @@ public class QSPanel extends LinearLayout implements Tunable {
            return false;
        }

        int getMaxColumns();

        /**
         * Sets the expansion value and proposedTranslation to panel.
         */
Loading