Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncButtonComponent.kt +17 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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, ) { ) { Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt +16 −3 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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, ) { ) { Loading @@ -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) Loading packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt +24 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) } } Loading Loading @@ -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 } } } } } packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncButtonComponent.kt +17 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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, ) { ) { Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/anc/ui/composable/AncPopup.kt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/button/ui/composable/ButtonComponent.kt +16 −3 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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, ) { ) { Loading @@ -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) Loading
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/popup/ui/composable/VolumePanelPopup.kt +24 −1 Original line number Original line Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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) } } Loading Loading @@ -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 } } } } }
packages/SystemUI/compose/features/src/com/android/systemui/volume/panel/component/spatialaudio/ui/composable/SpatialAudioPopup.kt +4 −2 Original line number Original line Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading