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

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

Merge changes I714601ab,I2f100f41,I8ded71ea into main

* changes:
  Wire haptics view model to the compose slider in the Volume Dialog
  Rework VolumeDialog slider using Compose
  Add VolumeDialogSliderTrack to support animated icons at the end of the track.
parents a5d2a6af a45edcfc
Loading
Loading
Loading
Loading
+47 −38
Original line number Diff line number Diff line
@@ -67,11 +67,10 @@ import com.android.systemui.Flags
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.common.ui.compose.Icon
import com.android.systemui.compose.modifiers.sysuiResTag
import com.android.systemui.haptics.slider.SeekableSliderTrackerConfig
import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig
import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel
import com.android.systemui.lifecycle.rememberViewModel
import com.android.systemui.res.R
import com.android.systemui.volume.haptics.ui.VolumeHapticsConfigsProvider
import com.android.systemui.volume.panel.component.volume.slider.ui.viewmodel.SliderState
import kotlin.math.round
import kotlinx.coroutines.flow.distinctUntilChanged
@@ -103,6 +102,10 @@ fun VolumeSlider(
    }

    val value by valueState(state)
    val interactionSource = remember { MutableInteractionSource() }
    val hapticsViewModel: SliderHapticsViewModel? =
        setUpHapticsViewModel(value, state.valueRange, interactionSource, hapticsViewModelFactory)

    Column(modifier = modifier.animateContentSize(), verticalArrangement = Arrangement.Top) {
        Row(
            horizontalArrangement = Arrangement.spacedBy(12.dp),
@@ -127,8 +130,14 @@ fun VolumeSlider(
        Slider(
            value = value,
            valueRange = state.valueRange,
            onValueChange = onValueChange,
            onValueChangeFinished = onValueChangeFinished,
            onValueChange = { newValue ->
                hapticsViewModel?.addVelocityDataPoint(newValue)
                onValueChange(newValue)
            },
            onValueChangeFinished = {
                hapticsViewModel?.onValueChangeEnded()
                onValueChangeFinished?.invoke()
            },
            enabled = state.isEnabled,
            modifier =
                Modifier.height(40.dp)
@@ -210,41 +219,8 @@ private fun LegacyVolumeSlider(
) {
    val value by valueState(state)
    val interactionSource = remember { MutableInteractionSource() }
    val sliderStepSize = 1f / (state.valueRange.endInclusive - state.valueRange.start)
    val hapticsViewModel: SliderHapticsViewModel? =
        hapticsViewModelFactory?.let {
            rememberViewModel(traceName = "SliderHapticsViewModel") {
                it.create(
                    interactionSource,
                    state.valueRange,
                    Orientation.Horizontal,
                    SliderHapticFeedbackConfig(
                        lowerBookendScale = 0.2f,
                        progressBasedDragMinScale = 0.2f,
                        progressBasedDragMaxScale = 0.5f,
                        deltaProgressForDragThreshold = 0f,
                        additionalVelocityMaxBump = 0.2f,
                        maxVelocityToScale = 0.1f, /* slider progress(from 0 to 1) per sec */
                        sliderStepSize = sliderStepSize,
                    ),
                    SeekableSliderTrackerConfig(
                        lowerBookendThreshold = 0f,
                        upperBookendThreshold = 1f,
                    ),
                )
            }
        }
    var lastDiscreteStep by remember { mutableFloatStateOf(round(value)) }
    LaunchedEffect(value) {
        snapshotFlow { value }
            .map { round(it) }
            .filter { it != lastDiscreteStep }
            .distinctUntilChanged()
            .collect { discreteStep ->
                lastDiscreteStep = discreteStep
                hapticsViewModel?.onValueChange(discreteStep)
            }
    }
        setUpHapticsViewModel(value, state.valueRange, interactionSource, hapticsViewModelFactory)

    PlatformSlider(
        modifier =
@@ -357,3 +333,36 @@ private fun SliderIcon(
        content = { Icon(modifier = Modifier.size(24.dp), icon = icon) },
    )
}

@Composable
fun setUpHapticsViewModel(
    value: Float,
    valueRange: ClosedFloatingPointRange<Float>,
    interactionSource: MutableInteractionSource,
    hapticsViewModelFactory: SliderHapticsViewModel.Factory?,
): SliderHapticsViewModel? {
    return hapticsViewModelFactory?.let {
        rememberViewModel(traceName = "SliderHapticsViewModel") {
                it.create(
                    interactionSource,
                    valueRange,
                    Orientation.Horizontal,
                    VolumeHapticsConfigsProvider.sliderHapticFeedbackConfig(valueRange),
                    VolumeHapticsConfigsProvider.seekableSliderTrackerConfig,
                )
            }
            .also { hapticsViewModel ->
                var lastDiscreteStep by remember { mutableFloatStateOf(round(value)) }
                LaunchedEffect(value) {
                    snapshotFlow { value }
                        .map { round(it) }
                        .filter { it != lastDiscreteStep }
                        .distinctUntilChanged()
                        .collect { discreteStep ->
                            lastDiscreteStep = discreteStep
                            hapticsViewModel.onValueChange(discreteStep)
                        }
                }
            }
    }
}
+2 −6
Original line number Diff line number Diff line
@@ -18,14 +18,10 @@
    android:layout_height="match_parent"
    android:maxHeight="@dimen/volume_dialog_slider_height">

    <com.google.android.material.slider.Slider
    <androidx.compose.ui.platform.ComposeView
        android:id="@+id/volume_dialog_slider"
        style="@style/SystemUI.Material3.Slider.Volume"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:layout_marginTop="-20dp"
        android:layout_marginBottom="-20dp"
        android:orientation="vertical"
        android:theme="@style/Theme.Material3.DayNight" />
        android:orientation="vertical" />
</FrameLayout>
 No newline at end of file
+0 −10
Original line number Diff line number Diff line
@@ -565,16 +565,6 @@
        <item name="android:windowNoTitle">true</item>
    </style>

    <style name="SystemUI.Material3.Slider.Volume">
        <item name="trackHeight">40dp</item>
        <item name="thumbHeight">52dp</item>
        <item name="trackCornerSize">12dp</item>
        <item name="trackInsideCornerSize">2dp</item>
        <item name="trackStopIndicatorSize">6dp</item>
        <item name="trackIconSize">20dp</item>
        <item name="labelBehavior">gone</item>
    </style>

    <style name="SystemUI.Material3.Slider" parent="@style/Widget.Material3.Slider">
        <item name="labelStyle">@style/Widget.Material3.Slider.Label</item>
        <item name="thumbColor">@color/thumb_color</item>
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.systemui.volume.dialog

import android.app.Dialog
import android.content.Context
import android.graphics.PixelFormat
import android.os.Bundle
@@ -24,6 +23,7 @@ import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.activity.ComponentDialog
import com.android.app.tracing.coroutines.coroutineScopeTraced
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.lifecycle.repeatWhenAttached
@@ -40,7 +40,7 @@ constructor(
    @Application context: Context,
    private val componentFactory: VolumeDialogComponent.Factory,
    private val visibilityInteractor: VolumeDialogVisibilityInteractor,
) : Dialog(context, R.style.Theme_SystemUI_Dialog_Volume) {
) : ComponentDialog(context, R.style.Theme_SystemUI_Dialog_Volume) {

    init {
        with(window!!) {
+0 −3
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package com.android.systemui.volume.dialog.sliders.dagger

import com.android.systemui.volume.dialog.sliders.domain.model.VolumeDialogSliderType
import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogOverscrollViewBinder
import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderHapticsViewBinder
import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderViewBinder
import dagger.BindsInstance
import dagger.Subcomponent
@@ -33,8 +32,6 @@ interface VolumeDialogSliderComponent {

    fun sliderViewBinder(): VolumeDialogSliderViewBinder

    fun sliderHapticsViewBinder(): VolumeDialogSliderHapticsViewBinder

    fun overscrollViewBinder(): VolumeDialogOverscrollViewBinder

    @Subcomponent.Factory
Loading