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

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

Merge "Add Haptics to the new VolumeDialog." into main

parents 4de3c191 085afaa8
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
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.VolumeDialogSliderHapticsViewBinder
import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderTouchesViewBinder
import com.android.systemui.volume.dialog.sliders.ui.VolumeDialogSliderViewBinder
import dagger.BindsInstance
@@ -34,6 +35,8 @@ interface VolumeDialogSliderComponent {

    fun sliderTouchesViewBinder(): VolumeDialogSliderTouchesViewBinder

    fun sliderHapticsViewBinder(): VolumeDialogSliderHapticsViewBinder

    @Subcomponent.Factory
    interface Factory {

+82 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.volume.dialog.sliders.ui

import android.view.View
import com.android.systemui.haptics.slider.HapticSlider
import com.android.systemui.haptics.slider.HapticSliderPlugin
import com.android.systemui.res.R
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.util.time.SystemClock
import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope
import com.android.systemui.volume.dialog.sliders.shared.model.SliderInputEvent
import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderInputEventsViewModel
import com.google.android.material.slider.Slider
import com.google.android.msdl.domain.MSDLPlayer
import javax.inject.Inject
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach

@VolumeDialogSliderScope
class VolumeDialogSliderHapticsViewBinder
@Inject
constructor(
    private val inputEventsViewModel: VolumeDialogSliderInputEventsViewModel,
    private val vibratorHelper: VibratorHelper,
    private val msdlPlayer: MSDLPlayer,
    private val systemClock: SystemClock,
) {

    fun CoroutineScope.bind(view: View) {
        val sliderView = view.requireViewById<Slider>(R.id.volume_dialog_slider)
        val hapticSliderPlugin =
            HapticSliderPlugin(
                slider = HapticSlider.Slider(sliderView),
                vibratorHelper = vibratorHelper,
                msdlPlayer = msdlPlayer,
                systemClock = systemClock,
            )
        hapticSliderPlugin.startInScope(this)

        sliderView.addOnChangeListener { _, value, fromUser ->
            hapticSliderPlugin.onProgressChanged(value.roundToInt(), fromUser)
        }
        sliderView.addOnSliderTouchListener(
            object : Slider.OnSliderTouchListener {

                override fun onStartTrackingTouch(slider: Slider) {
                    hapticSliderPlugin.onStartTrackingTouch()
                }

                override fun onStopTrackingTouch(slider: Slider) {
                    hapticSliderPlugin.onStopTrackingTouch()
                }
            }
        )

        inputEventsViewModel.event
            .onEach {
                when (it) {
                    is SliderInputEvent.Button -> hapticSliderPlugin.onKeyDown()
                    is SliderInputEvent.Touch -> hapticSliderPlugin.onTouchEvent(it.event)
                }
            }
            .launchIn(this)
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -20,14 +20,14 @@ import android.annotation.SuppressLint
import android.view.View
import com.android.systemui.res.R
import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope
import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderTouchesViewModel
import com.android.systemui.volume.dialog.sliders.ui.viewmodel.VolumeDialogSliderInputEventsViewModel
import com.google.android.material.slider.Slider
import javax.inject.Inject

@VolumeDialogSliderScope
class VolumeDialogSliderTouchesViewBinder
@Inject
constructor(private val viewModel: VolumeDialogSliderTouchesViewModel) {
constructor(private val viewModel: VolumeDialogSliderInputEventsViewModel) {

    @SuppressLint("ClickableViewAccessibility")
    fun bind(view: View) {
+0 −1
Original line number Diff line number Diff line
@@ -57,7 +57,6 @@ constructor(
    }

    private suspend fun VolumeDialogStreamModel.bindToSlider(slider: Slider) {
        slider.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY -> }
        with(slider) {
            valueFrom = levelMin.toFloat()
            valueTo = levelMax.toFloat()
+1 −0
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ constructor(private val viewModel: VolumeDialogSlidersViewModel) {
    ) {
        with(component.sliderViewBinder()) { bind(sliderContainer) }
        with(component.sliderTouchesViewBinder()) { bind(sliderContainer) }
        with(component.sliderHapticsViewBinder()) { bind(sliderContainer) }
    }
}

Loading