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

Commit a94d9cc5 authored by Anton Potapov's avatar Anton Potapov
Browse files

Add gravity for VolumePanelPopup depending on the formfactor and

orientation

Flag: aconfig new_volume_panel NEXTFOOD
Test: manual on the foldable. Open spatial audio and anc popups to check
the gravity
Fixes: 338912479

Change-Id: I6af84253823a195556ca66e2cee2922eeea848c5
parent c6a68fea
Loading
Loading
Loading
Loading
+17 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.volume.panel.component.anc.ui.composable

import android.view.Gravity
import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
@@ -27,9 +28,15 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.clearAndSetSemantics
@@ -39,6 +46,7 @@ import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import com.android.systemui.res.R
import com.android.systemui.volume.panel.component.anc.ui.viewmodel.AncViewModel
import com.android.systemui.volume.panel.component.popup.ui.composable.VolumePanelPopup
import com.android.systemui.volume.panel.ui.composable.ComposeVolumePanelUiComponent
import com.android.systemui.volume.panel.ui.composable.VolumePanelComposeScope
import javax.inject.Inject
@@ -54,15 +62,22 @@ constructor(
    override fun VolumePanelComposeScope.Content(modifier: Modifier) {
        val slice by viewModel.buttonSlice.collectAsState()
        val label = stringResource(R.string.volume_panel_noise_control_title)
        val screenWidth: Float =
            with(LocalDensity.current) { LocalConfiguration.current.screenWidthDp.dp.toPx() }
        var gravity by remember { mutableIntStateOf(Gravity.CENTER_HORIZONTAL) }
        val isClickable = viewModel.isClickable(slice)
        val onClick =
            if (isClickable) {
                { ancPopup.show(null) }
                { with(ancPopup) { show(null, gravity) } }
            } else {
                null
            }

        Column(
            modifier = modifier,
            modifier =
                modifier.onGloballyPositioned {
                    gravity = VolumePanelPopup.calculateGravity(it, screenWidth)
                },
            verticalArrangement = Arrangement.spacedBy(12.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
+4 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.volume.panel.component.anc.ui.composable

import android.view.Gravity
import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material3.MaterialTheme
@@ -47,9 +48,10 @@ constructor(
) {

    /** Shows a popup with the [expandable] animation. */
    fun show(expandable: Expandable?) {
    fun show(expandable: Expandable?, horizontalGravity: Int) {
        uiEventLogger.log(VolumePanelUiEvent.VOLUME_PANEL_ANC_POPUP_SHOWN)
        volumePanelPopup.show(expandable, { Title() }, { Content(it) })
        val gravity = horizontalGravity or Gravity.BOTTOM
        volumePanelPopup.show(expandable, gravity, { Title() }, { Content(it) })
    }

    @Composable
+16 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.volume.panel.component.button.ui.composable

import android.view.Gravity
import androidx.compose.foundation.basicMarquee
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -29,8 +30,14 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.LocalConfiguration
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.clearAndSetSemantics
import androidx.compose.ui.semantics.contentDescription
@@ -41,6 +48,7 @@ import com.android.compose.animation.Expandable
import com.android.systemui.animation.Expandable
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.volume.panel.component.button.ui.viewmodel.ButtonViewModel
import com.android.systemui.volume.panel.component.popup.ui.composable.VolumePanelPopup.Companion.calculateGravity
import com.android.systemui.volume.panel.ui.composable.ComposeVolumePanelUiComponent
import com.android.systemui.volume.panel.ui.composable.VolumePanelComposeScope
import kotlinx.coroutines.flow.StateFlow
@@ -48,7 +56,7 @@ import kotlinx.coroutines.flow.StateFlow
/** [ComposeVolumePanelUiComponent] implementing a clickable button from a bottom row. */
class ButtonComponent(
    private val viewModelFlow: StateFlow<ButtonViewModel?>,
    private val onClick: (Expandable) -> Unit
    private val onClick: (expandable: Expandable, horizontalGravity: Int) -> Unit
) : ComposeVolumePanelUiComponent {

    @Composable
@@ -57,8 +65,13 @@ class ButtonComponent(
        val viewModel = viewModelByState ?: return
        val label = viewModel.label.toString()

        val screenWidth: Float =
            with(LocalDensity.current) { LocalConfiguration.current.screenWidthDp.dp.toPx() }
        var gravity by remember { mutableIntStateOf(Gravity.CENTER_HORIZONTAL) }

        Column(
            modifier = modifier,
            modifier =
                modifier.onGloballyPositioned { gravity = calculateGravity(it, screenWidth) },
            verticalArrangement = Arrangement.spacedBy(12.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
@@ -82,7 +95,7 @@ class ButtonComponent(
                        } else {
                            MaterialTheme.colorScheme.onSurface
                        },
                    onClick = onClick,
                    onClick = { onClick(it, gravity) },
                ) {
                    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                        Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+24 −1
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.volume.panel.component.popup.ui.composable

import android.view.Gravity
import androidx.annotation.GravityInt
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -31,6 +32,8 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.layout.boundsInRoot
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.paneTitle
@@ -60,13 +63,14 @@ constructor(
     */
    fun show(
        expandable: Expandable?,
        @GravityInt gravity: Int,
        title: @Composable (SystemUIDialog) -> Unit,
        content: @Composable (SystemUIDialog) -> Unit,
    ) {
        val dialog =
            dialogFactory.create(
                theme = R.style.Theme_VolumePanel_Popup,
                dialogGravity = Gravity.BOTTOM,
                dialogGravity = gravity,
            ) {
                PopupComposable(it, title, content)
            }
@@ -122,4 +126,23 @@ constructor(
            }
        }
    }

    companion object {

        /**
         * Returns absolute ([Gravity.LEFT], [Gravity.RIGHT] or [Gravity.CENTER_HORIZONTAL])
         * [GravityInt] for the popup based on the [coordinates] global position relative to the
         * [screenWidthPx].
         */
        @GravityInt
        fun calculateGravity(coordinates: LayoutCoordinates, screenWidthPx: Float): Int {
            val bottomCenter: Float = coordinates.boundsInRoot().bottomCenter.x
            val rootBottomCenter: Float = screenWidthPx / 2
            return when {
                bottomCenter < rootBottomCenter -> Gravity.LEFT
                bottomCenter > rootBottomCenter -> Gravity.RIGHT
                else -> Gravity.CENTER_HORIZONTAL
            }
        }
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.volume.panel.component.spatialaudio.ui.composable

import android.view.Gravity
import androidx.compose.foundation.basicMarquee
import androidx.compose.material3.LocalContentColor
import androidx.compose.material3.MaterialTheme
@@ -47,14 +48,15 @@ constructor(
) {

    /** Shows a popup with the [expandable] animation. */
    fun show(expandable: Expandable) {
    fun show(expandable: Expandable, horizontalGravity: Int) {
        uiEventLogger.logWithPosition(
            VolumePanelUiEvent.VOLUME_PANEL_SPATIAL_AUDIO_POP_UP_SHOWN,
            0,
            null,
            viewModel.spatialAudioButtons.value.indexOfFirst { it.button.isActive }
        )
        volumePanelPopup.show(expandable, { Title() }, { Content(it) })
        val gravity = horizontalGravity or Gravity.BOTTOM
        volumePanelPopup.show(expandable, gravity, { Title() }, { Content(it) })
    }

    @Composable