Merge "Fix height of QQS so it's wrap content" into main
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
index c027c49..de8f2ec 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettings.kt
@@ -18,21 +18,21 @@
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.layout
import androidx.compose.ui.platform.LocalContext
-import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.android.compose.animation.scene.ElementKey
+import com.android.compose.animation.scene.MovableElementScenePicker
import com.android.compose.animation.scene.SceneScope
import com.android.compose.animation.scene.TransitionState
+import com.android.compose.modifiers.thenIf
import com.android.compose.theme.colorAttr
import com.android.systemui.qs.ui.adapter.QSSceneAdapter
import com.android.systemui.qs.ui.adapter.QSSceneAdapter.State.Companion.Collapsing
@@ -44,9 +44,16 @@
import com.android.systemui.scene.ui.composable.Shade
object QuickSettings {
+ private val SCENES =
+ setOf(
+ QuickSettingsSceneKey,
+ Shade,
+ )
+
object Elements {
// TODO RENAME
- val Content = ElementKey("QuickSettingsContent")
+ val Content =
+ ElementKey("QuickSettingsContent", scenePicker = MovableElementScenePicker(SCENES))
val CollapsedGrid = ElementKey("QuickSettingsCollapsedGrid")
val FooterActions = ElementKey("QuickSettingsFooterActions")
}
@@ -86,14 +93,22 @@
*/
@Composable
fun SceneScope.QuickSettings(
- modifier: Modifier = Modifier,
qsSceneAdapter: QSSceneAdapter,
+ heightProvider: () -> Int,
+ modifier: Modifier = Modifier,
) {
val contentState = stateForQuickSettingsContent()
MovableElement(
key = QuickSettings.Elements.Content,
- modifier = modifier.fillMaxWidth().defaultMinSize(minHeight = 300.dp)
+ modifier =
+ modifier.fillMaxWidth().layout { measurable, constraints ->
+ val placeable = measurable.measure(constraints)
+ // Use the height of the correct view based on the scene it is being composed in
+ val height = heightProvider()
+
+ layout(placeable.width, height) { placeable.placeRelative(0, 0) }
+ }
) {
content { QuickSettingsContent(qsSceneAdapter = qsSceneAdapter, contentState) }
}
@@ -118,15 +133,7 @@
qsView?.let { view ->
Box(
modifier =
- modifier
- .fillMaxWidth()
- .then(
- if (isCustomizing) {
- Modifier.fillMaxHeight()
- } else {
- Modifier.wrapContentHeight()
- }
- )
+ modifier.fillMaxWidth().thenIf(isCustomizing) { Modifier.fillMaxHeight() }
) {
AndroidView(
modifier = Modifier.fillMaxWidth().background(colorAttr(R.attr.underSurface)),
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
index 969dec3..1cbc992 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/qs/ui/composable/QuickSettingsScene.kt
@@ -213,8 +213,9 @@
Spacer(modifier = Modifier.height(16.dp))
// This view has its own horizontal padding
QuickSettings(
- modifier = Modifier.sysuiResTag("expanded_qs_scroll_view"),
viewModel.qsSceneAdapter,
+ { viewModel.qsSceneAdapter.qsHeight },
+ modifier = Modifier.sysuiResTag("expanded_qs_scroll_view"),
)
}
}
diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
index 677df7e..cac35cb 100644
--- a/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
+++ b/packages/SystemUI/compose/features/src/com/android/systemui/shade/ui/composable/ShadeScene.kt
@@ -189,8 +189,8 @@
)
)
QuickSettings(
- modifier = Modifier.height(130.dp),
viewModel.qsSceneAdapter,
+ { viewModel.qsSceneAdapter.qqsHeight },
)
if (viewModel.isMediaVisible()) {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
index 42200a3..51f8b11 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneViewModelTest.kt
@@ -61,7 +61,7 @@
private val sceneInteractor by lazy { kosmos.sceneInteractor }
private val mobileIconsInteractor = FakeMobileIconsInteractor(FakeMobileMappingsProxy(), mock())
private val flags = FakeFeatureFlagsClassic().also { it.set(Flags.NEW_NETWORK_SLICE_UI, false) }
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter({ mock() })
private val footerActionsViewModel = mock<FooterActionsViewModel>()
private val footerActionsViewModelFactory =
mock<FooterActionsViewModel.Factory> {
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
index 5ef095f..f1f5dc3 100644
--- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
+++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/ui/viewmodel/ShadeSceneViewModelTest.kt
@@ -82,7 +82,7 @@
scope = testScope.backgroundScope,
)
- private val qsFlexiglassAdapter = FakeQSSceneAdapter { mock() }
+ private val qsFlexiglassAdapter = FakeQSSceneAdapter({ mock() })
private lateinit var shadeHeaderViewModel: ShadeHeaderViewModel
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index a2dfc01..c0d9644 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -157,6 +157,12 @@
super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed,
parentHeightMeasureSpec, heightUsed);
}
+ } else {
+ // Don't measure the customizer with all the children, it will be measured separately
+ if (child != mQSCustomizer) {
+ super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed,
+ parentHeightMeasureSpec, heightUsed);
+ }
}
}
@@ -248,6 +254,25 @@
+ mHeader.getHeight();
}
+ // These next two methods are used with Scene container to determine the size of QQS and QS .
+
+ /**
+ * Returns the size of the QQS container, regardless of the measured size of this view.
+ * @return size in pixels of QQS
+ */
+ public int getQqsHeight() {
+ return mHeader.getHeight();
+ }
+
+ /**
+ * Returns the size of QS (or the QSCustomizer), regardless of the measured size of this view
+ * @return size in pixels of QS (or QSCustomizer)
+ */
+ public int getQsHeight() {
+ return mQSCustomizer.isCustomizing() ? mQSCustomizer.getMeasuredHeight()
+ : mQSPanel.getMeasuredHeight();
+ }
+
public void setExpansion(float expansion) {
mQsExpansion = expansion;
if (mQSPanelContainer != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
index 290821e..4d55714 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSImpl.java
@@ -984,6 +984,14 @@
return mListeningAndVisibilityLifecycleOwner;
}
+ public int getQQSHeight() {
+ return mContainer.getQqsHeight();
+ }
+
+ public int getQSHeight() {
+ return mContainer.getQsHeight();
+ }
+
@NeverCompile
@Override
public void dump(PrintWriter pw, String[] args) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
index 0d43396..3d12eed 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt
@@ -28,6 +28,7 @@
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.plugins.qs.QSContainerController
+import com.android.systemui.qs.QSContainerImpl
import com.android.systemui.qs.QSImpl
import com.android.systemui.qs.dagger.QSSceneComponent
import com.android.systemui.res.R
@@ -68,6 +69,15 @@
/** Set the current state for QS. [state]. */
fun setState(state: State)
+ /** The current height of QQS in the current [qsView], or 0 if there's no view. */
+ val qqsHeight: Int
+
+ /**
+ * The current height of QS in the current [qsView], or 0 if there's no view. If customizing, it
+ * will return the height allocated to the customizer.
+ */
+ val qsHeight: Int
+
sealed class State(
val isVisible: Boolean,
val expansion: Float,
@@ -121,6 +131,11 @@
val qsImpl = _qsImpl.asStateFlow()
override val qsView: Flow<View> = _qsImpl.map { it?.view }.filterNotNull()
+ override val qqsHeight: Int
+ get() = qsImpl.value?.qqsHeight ?: 0
+ override val qsHeight: Int
+ get() = qsImpl.value?.qsHeight ?: 0
+
// Same config changes as in FragmentHostManager
private val interestingChanges =
InterestingConfigChanges(
diff --git a/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt
index fcbe9a6..356eb85 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/KeyguardlessSceneContainerFrameworkModule.kt
@@ -45,8 +45,8 @@
sceneKeys =
listOf(
SceneKey.Gone,
- SceneKey.Shade,
SceneKey.QuickSettings,
+ SceneKey.Shade,
),
initialSceneKey = SceneKey.Gone,
)
diff --git a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
index 0f3acaf..c7d3a4a 100644
--- a/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
+++ b/packages/SystemUI/src/com/android/systemui/scene/SceneContainerFrameworkModule.kt
@@ -69,8 +69,8 @@
SceneKey.Communal,
SceneKey.Lockscreen,
SceneKey.Bouncer,
- SceneKey.Shade,
SceneKey.QuickSettings,
+ SceneKey.Shade,
),
initialSceneKey = SceneKey.Lockscreen,
)
diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
index e67df9d..8e430db 100644
--- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
+++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/ui/adapter/FakeQSSceneAdapter.kt
@@ -26,6 +26,8 @@
class FakeQSSceneAdapter(
private val inflateDelegate: suspend (Context) -> View,
+ override val qqsHeight: Int = 0,
+ override val qsHeight: Int = 0,
) : QSSceneAdapter {
private val _customizing = MutableStateFlow(false)
override val isCustomizing: StateFlow<Boolean> = _customizing.asStateFlow()