diff options
| author | 2024-11-08 03:11:49 +0000 | |
|---|---|---|
| committer | 2024-11-08 03:11:49 +0000 | |
| commit | e9ae9f2ceda58c52ff8928d58c4ff9febe696269 (patch) | |
| tree | 8f780c2055e0c61704cf47d2fe15829b410e1c14 | |
| parent | 44c1984523ef4090d318372a57a07b20c6e26dd6 (diff) | |
| parent | 0cd1b994c9d7c00fb1cf05e1187f6f6ee7d132a9 (diff) | |
Merge "Add toast and timeout logic in ringer" into main
9 files changed, 220 insertions, 1 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt index 9440a9364b62..fb157958a630 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/VolumeDialogComponent.kt @@ -16,6 +16,7 @@ package com.android.systemui.volume.dialog.dagger +import com.android.systemui.volume.dialog.dagger.module.VolumeDialogModule import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog import com.android.systemui.volume.dialog.dagger.scope.VolumeDialogScope import com.android.systemui.volume.dialog.sliders.dagger.VolumeDialogSliderComponent @@ -28,7 +29,7 @@ import kotlinx.coroutines.CoroutineScope * [com.android.systemui.volume.dialog.VolumeDialogPlugin] and lives alongside it. */ @VolumeDialogScope -@Subcomponent(modules = []) +@Subcomponent(modules = [VolumeDialogModule::class]) interface VolumeDialogComponent { /** diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt new file mode 100644 index 000000000000..025e269b70b6 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/dagger/module/VolumeDialogModule.kt @@ -0,0 +1,32 @@ +/* + * 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.dagger.module + +import com.android.systemui.volume.dialog.ringer.data.repository.VolumeDialogRingerFeedbackRepository +import com.android.systemui.volume.dialog.ringer.data.repository.VolumeDialogRingerFeedbackRepositoryImpl +import dagger.Binds +import dagger.Module + +/** Dagger module for volume dialog code in the volume package */ +@Module +interface VolumeDialogModule { + + @Binds + fun bindVolumeDialogRingerFeedbackRepository( + ringerFeedbackRepository: VolumeDialogRingerFeedbackRepositoryImpl + ): VolumeDialogRingerFeedbackRepository +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepository.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepository.kt new file mode 100644 index 000000000000..263972b937d4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepository.kt @@ -0,0 +1,57 @@ +/* + * 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.ringer.data.repository + +import android.content.Context +import com.android.systemui.Prefs +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.dagger.qualifiers.Background +import javax.inject.Inject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.withContext + +interface VolumeDialogRingerFeedbackRepository { + + /** gets number of shown toasts */ + suspend fun getToastCount(): Int + + /** updates number of shown toasts */ + suspend fun updateToastCount(toastCount: Int) +} + +class VolumeDialogRingerFeedbackRepositoryImpl +@Inject +constructor( + @Application private val applicationContext: Context, + @Background val backgroundDispatcher: CoroutineDispatcher, +) : VolumeDialogRingerFeedbackRepository { + + override suspend fun getToastCount(): Int = + withContext(backgroundDispatcher) { + return@withContext Prefs.getInt( + applicationContext, + Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, + 0, + ) + } + + override suspend fun updateToastCount(toastCount: Int) { + withContext(backgroundDispatcher) { + Prefs.putInt(applicationContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, toastCount + 1) + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt index 281e57fec855..b83613ba4f8c 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt @@ -26,6 +26,7 @@ import com.android.settingslib.volume.shared.model.RingerMode import com.android.systemui.plugins.VolumeDialogController import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogStateInteractor +import com.android.systemui.volume.dialog.ringer.data.repository.VolumeDialogRingerFeedbackRepository import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel import com.android.systemui.volume.dialog.shared.model.VolumeDialogStateModel import javax.inject.Inject @@ -45,6 +46,7 @@ constructor( volumeDialogStateInteractor: VolumeDialogStateInteractor, private val controller: VolumeDialogController, private val audioSystemRepository: AudioSystemRepository, + private val ringerFeedbackRepository: VolumeDialogRingerFeedbackRepository, ) { val ringerModel: Flow<VolumeDialogRingerModel> = @@ -84,4 +86,12 @@ constructor( fun scheduleTouchFeedback() { controller.scheduleTouchFeedback() } + + suspend fun getToastCount(): Int { + return ringerFeedbackRepository.getToastCount() + } + + suspend fun updateToastCount(toastCount: Int) { + ringerFeedbackRepository.updateToastCount(toastCount) + } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt index d4da226152f3..e040638324ac 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt @@ -16,17 +16,23 @@ package com.android.systemui.volume.dialog.ringer.ui.viewmodel +import android.content.Context import android.media.AudioAttributes import android.media.AudioManager.RINGER_MODE_NORMAL import android.media.AudioManager.RINGER_MODE_SILENT import android.media.AudioManager.RINGER_MODE_VIBRATE import android.os.VibrationEffect +import android.widget.Toast +import com.android.internal.R as internalR +import com.android.settingslib.Utils import com.android.settingslib.volume.shared.model.RingerMode +import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.res.R import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.volume.Events import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog +import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogVisibilityInteractor import com.android.systemui.volume.dialog.ringer.domain.VolumeDialogRingerInteractor import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel import com.android.systemui.volume.dialog.shared.VolumeDialogLogger @@ -40,26 +46,37 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch + +private const val SHOW_RINGER_TOAST_COUNT = 12 class VolumeDialogRingerDrawerViewModel @AssistedInject constructor( + @Application private val applicationContext: Context, @VolumeDialog private val coroutineScope: CoroutineScope, @Background private val backgroundDispatcher: CoroutineDispatcher, private val interactor: VolumeDialogRingerInteractor, private val vibrator: VibratorHelper, private val volumeDialogLogger: VolumeDialogLogger, + private val visibilityInteractor: VolumeDialogVisibilityInteractor, ) { private val drawerState = MutableStateFlow<RingerDrawerState>(RingerDrawerState.Initial) val ringerViewModel: StateFlow<RingerViewModelState> = combine(interactor.ringerModel, drawerState) { ringerModel, state -> + level = ringerModel.level + levelMax = ringerModel.levelMax ringerModel.toViewModel(state) } .flowOn(backgroundDispatcher) .stateIn(coroutineScope, SharingStarted.Eagerly, RingerViewModelState.Unavailable) + // Level and Maximum level of Ring Stream. + private var level = -1 + private var levelMax = -1 + // Vibration attributes. private val sonificiationVibrationAttributes = AudioAttributes.Builder() @@ -71,8 +88,10 @@ constructor( if (drawerState.value is RingerDrawerState.Open) { Events.writeEvent(Events.EVENT_RINGER_TOGGLE, ringerMode.value) provideTouchFeedback(ringerMode) + maybeShowToast(ringerMode) interactor.setRingerMode(ringerMode) } + visibilityInteractor.resetDismissTimeout() drawerState.value = when (drawerState.value) { is RingerDrawerState.Initial -> { @@ -201,6 +220,46 @@ constructor( } } + private fun maybeShowToast(ringerMode: RingerMode) { + coroutineScope.launch { + val seenToastCount = interactor.getToastCount() + if (seenToastCount > SHOW_RINGER_TOAST_COUNT) { + return@launch + } + + val toastText = + when (ringerMode.value) { + RINGER_MODE_NORMAL -> { + if (level != -1 && levelMax != -1) { + applicationContext.getString( + R.string.volume_dialog_ringer_guidance_ring, + Utils.formatPercentage(level.toLong(), levelMax.toLong()), + ) + } else { + null + } + } + + RINGER_MODE_SILENT -> + applicationContext.getString( + internalR.string.volume_dialog_ringer_guidance_silent + ) + + RINGER_MODE_VIBRATE -> + applicationContext.getString( + internalR.string.volume_dialog_ringer_guidance_vibrate + ) + + else -> + applicationContext.getString( + internalR.string.volume_dialog_ringer_guidance_vibrate + ) + } + toastText?.let { Toast.makeText(applicationContext, it, Toast.LENGTH_SHORT).show() } + interactor.updateToastCount(seenToastCount) + } + } + @AssistedFactory interface Factory { fun create(): VolumeDialogRingerDrawerViewModel diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/FakeVolumeDialogRingerFeedbackRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/FakeVolumeDialogRingerFeedbackRepository.kt new file mode 100644 index 000000000000..d42de1e6d0df --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/FakeVolumeDialogRingerFeedbackRepository.kt @@ -0,0 +1,30 @@ +/* + * 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.ringer.data.repository + +class FakeVolumeDialogRingerFeedbackRepository : VolumeDialogRingerFeedbackRepository { + + private var seenToastCount = 0 + + override suspend fun getToastCount(): Int { + return seenToastCount + } + + override suspend fun updateToastCount(toastCount: Int) { + seenToastCount = toastCount + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepositoryKosmos.kt new file mode 100644 index 000000000000..44371b4615df --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/repository/VolumeDialogRingerFeedbackRepositoryKosmos.kt @@ -0,0 +1,24 @@ +/* + * 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.ringer.data.repository + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeVolumeDialogRingerFeedbackRepository by + Kosmos.Fixture { FakeVolumeDialogRingerFeedbackRepository() } +val Kosmos.volumeDialogRingerFeedbackRepository by + Kosmos.Fixture { fakeVolumeDialogRingerFeedbackRepository } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt index 1addd91d2ec2..a494d04ec741 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt @@ -21,6 +21,7 @@ import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.plugins.volumeDialogController import com.android.systemui.volume.data.repository.audioSystemRepository import com.android.systemui.volume.dialog.domain.interactor.volumeDialogStateInteractor +import com.android.systemui.volume.dialog.ringer.data.repository.fakeVolumeDialogRingerFeedbackRepository val Kosmos.volumeDialogRingerInteractor by Kosmos.Fixture { @@ -29,5 +30,6 @@ val Kosmos.volumeDialogRingerInteractor by volumeDialogStateInteractor = volumeDialogStateInteractor, controller = volumeDialogController, audioSystemRepository = audioSystemRepository, + ringerFeedbackRepository = fakeVolumeDialogRingerFeedbackRepository, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt index db1c01a8698c..c8ba551c518a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt @@ -16,20 +16,24 @@ package com.android.systemui.volume.dialog.ringer.ui.viewmodel +import android.content.applicationContext import com.android.systemui.haptics.vibratorHelper import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testDispatcher +import com.android.systemui.volume.dialog.domain.interactor.volumeDialogVisibilityInteractor import com.android.systemui.volume.dialog.ringer.domain.volumeDialogRingerInteractor import com.android.systemui.volume.dialog.shared.volumeDialogLogger val Kosmos.volumeDialogRingerDrawerViewModel by Kosmos.Fixture { VolumeDialogRingerDrawerViewModel( + applicationContext = applicationContext, backgroundDispatcher = testDispatcher, coroutineScope = applicationCoroutineScope, interactor = volumeDialogRingerInteractor, vibrator = vibratorHelper, volumeDialogLogger = volumeDialogLogger, + visibilityInteractor = volumeDialogVisibilityInteractor, ) } |