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

Commit 9cfa08fa authored by Anton Potapov's avatar Anton Potapov Committed by Android (Google) Code Review
Browse files

Merge "Add gravity for VolumePanelPopup depending on the formfactor and orientation" into main

parents d070c75f a94d9cc5
Loading
Loading
Loading
Loading
+17 −2
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


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


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

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


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


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


    /** Shows a popup with the [expandable] animation. */
    /** 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)
        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
    @Composable
+16 −3
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


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


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


    @Composable
    @Composable
@@ -57,8 +65,13 @@ class ButtonComponent(
        val viewModel = viewModelByState ?: return
        val viewModel = viewModelByState ?: return
        val label = viewModel.label.toString()
        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(
        Column(
            modifier = modifier,
            modifier =
                modifier.onGloballyPositioned { gravity = calculateGravity(it, screenWidth) },
            verticalArrangement = Arrangement.spacedBy(12.dp),
            verticalArrangement = Arrangement.spacedBy(12.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
            horizontalAlignment = Alignment.CenterHorizontally,
        ) {
        ) {
@@ -82,7 +95,7 @@ class ButtonComponent(
                        } else {
                        } else {
                            MaterialTheme.colorScheme.onSurface
                            MaterialTheme.colorScheme.onSurface
                        },
                        },
                    onClick = onClick,
                    onClick = { onClick(it, gravity) },
                ) {
                ) {
                    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
                        Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
                        Icon(modifier = Modifier.size(24.dp), icon = viewModel.icon)
+24 −1
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.systemui.volume.panel.component.popup.ui.composable
package com.android.systemui.volume.panel.component.popup.ui.composable


import android.view.Gravity
import android.view.Gravity
import androidx.annotation.GravityInt
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Column
@@ -31,6 +32,8 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
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.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.paneTitle
import androidx.compose.ui.semantics.paneTitle
@@ -60,13 +63,14 @@ constructor(
     */
     */
    fun show(
    fun show(
        expandable: Expandable?,
        expandable: Expandable?,
        @GravityInt gravity: Int,
        title: @Composable (SystemUIDialog) -> Unit,
        title: @Composable (SystemUIDialog) -> Unit,
        content: @Composable (SystemUIDialog) -> Unit,
        content: @Composable (SystemUIDialog) -> Unit,
    ) {
    ) {
        val dialog =
        val dialog =
            dialogFactory.create(
            dialogFactory.create(
                theme = R.style.Theme_VolumePanel_Popup,
                theme = R.style.Theme_VolumePanel_Popup,
                dialogGravity = Gravity.BOTTOM,
                dialogGravity = gravity,
            ) {
            ) {
                PopupComposable(it, title, content)
                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 Original line Diff line number Diff line
@@ -16,6 +16,7 @@


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


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


    /** Shows a popup with the [expandable] animation. */
    /** Shows a popup with the [expandable] animation. */
    fun show(expandable: Expandable) {
    fun show(expandable: Expandable, horizontalGravity: Int) {
        uiEventLogger.logWithPosition(
        uiEventLogger.logWithPosition(
            VolumePanelUiEvent.VOLUME_PANEL_SPATIAL_AUDIO_POP_UP_SHOWN,
            VolumePanelUiEvent.VOLUME_PANEL_SPATIAL_AUDIO_POP_UP_SHOWN,
            0,
            0,
            null,
            null,
            viewModel.spatialAudioButtons.value.indexOfFirst { it.button.isActive }
            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
    @Composable