diff options
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt | 3 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderHapticsViewBinder.kt | 82 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt | 4 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt | 1 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt | 1 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderInputEventsViewModel.kt (renamed from packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderTouchesViewModel.kt) | 15 |
6 files changed, 101 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt index 772ae7736cad..c0c525bcb37d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/dagger/VolumeDialogSliderComponent.kt @@ -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 { diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderHapticsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderHapticsViewBinder.kt new file mode 100644 index 000000000000..5a7fbc6341f2 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderHapticsViewBinder.kt @@ -0,0 +1,82 @@ +/* + * 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) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt index e0336243b327..4ecac7a81893 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderTouchesViewBinder.kt @@ -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) { diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt index f9334dfc7ba2..e52bad9c39bf 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSliderViewBinder.kt @@ -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() diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt index 242845a47f29..c9b525930ed3 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/VolumeDialogSlidersViewBinder.kt @@ -62,6 +62,7 @@ constructor(private val viewModel: VolumeDialogSlidersViewModel) { ) { with(component.sliderViewBinder()) { bind(sliderContainer) } with(component.sliderTouchesViewBinder()) { bind(sliderContainer) } + with(component.sliderHapticsViewBinder()) { bind(sliderContainer) } } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderTouchesViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderInputEventsViewModel.kt index 9126f45fe32a..755776ac9723 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderTouchesViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/sliders/ui/viewmodel/VolumeDialogSliderInputEventsViewModel.kt @@ -17,14 +17,25 @@ package com.android.systemui.volume.dialog.sliders.ui.viewmodel import android.view.MotionEvent +import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderScope import com.android.systemui.volume.dialog.sliders.domain.interactor.VolumeDialogSliderInputEventsInteractor import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.stateIn @VolumeDialogSliderScope -class VolumeDialogSliderTouchesViewModel +class VolumeDialogSliderInputEventsViewModel @Inject -constructor(private val interactor: VolumeDialogSliderInputEventsInteractor) { +constructor( + @VolumeDialog private val coroutineScope: CoroutineScope, + private val interactor: VolumeDialogSliderInputEventsInteractor, +) { + + val event = + interactor.event.stateIn(coroutineScope, SharingStarted.Eagerly, null).filterNotNull() fun onTouchEvent(event: MotionEvent) { interactor.onTouchEvent(event) |