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

Commit 085afaa8 authored by Anton Potapov's avatar Anton Potapov
Browse files

Add Haptics to the new VolumeDialog.

Flag: com.android.systemui.volume_redesign
Bug: 369992924
Test: manual on a phone. Adjust volume and feel the vibration
Change-Id: If274e6ba81f6e432e06bda507ca795e70b9f661e
parent dd413e96
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