From 18bd504bce6304584e35ddba3a0a5a937eae4c8d Mon Sep 17 00:00:00 2001 From: Alejandro Nijamkin Date: Tue, 30 May 2023 16:52:02 -0700 Subject: [PATCH] Fixes i18n issue with shortcut names. Some lock screen shortcut names were not updating to their translated names when the user changed system language, remaining with the old language in Settings and in Wallpaper Picker. This CL fixes that issue. The cause for the issue was how some pickerName properties were implemented using a getter and some were constants, without a getter. The constant ones were not being translated. The approach in the CL is to actually move from a property to a method call. This way, there is no choice but to recalculate the name of the affordance every time; closing the door on the reintroduction of this issue when a new config implementation is added with the developer skipping the getter. Fix: 280077350 Fix: 280829365 Fix: 278858630 Test: changed languages and verified that the shortcut names are updated to the new language in both "Wallpaper & style" and in Display > Lock screen Change-Id: I2d3e3a621b6f24c42c1600ce4af17617dd52560a --- .../CameraQuickAffordanceConfig.kt | 3 +- .../DoNotDisturbQuickAffordanceConfig.kt | 2 +- .../FlashlightQuickAffordanceConfig.kt | 3 +- ...meControlsKeyguardQuickAffordanceConfig.kt | 2 +- .../KeyguardQuickAffordanceConfig.kt | 8 ++- .../MuteQuickAffordanceConfig.kt | 71 ++++++++++--------- ...odeScannerKeyguardQuickAffordanceConfig.kt | 3 +- ...cessWalletKeyguardQuickAffordanceConfig.kt | 2 +- .../VideoCameraQuickAffordanceConfig.kt | 3 +- .../KeyguardQuickAffordanceRepository.kt | 6 +- .../NoteTaskQuickAffordanceConfig.kt | 2 +- .../FakeKeyguardQuickAffordanceConfig.kt | 4 +- .../KeyguardQuickAffordanceRepositoryTest.kt | 4 +- .../KeyguardQuickAffordanceInteractorTest.kt | 12 ++-- 14 files changed, 67 insertions(+), 58 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt index c9f645dddd8df..af0abdff0c62f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/CameraQuickAffordanceConfig.kt @@ -52,8 +52,7 @@ constructor( override val key: String get() = BuiltInKeyguardQuickAffordanceKeys.CAMERA - override val pickerName: String - get() = context.getString(R.string.accessibility_camera_button) + override fun pickerName(): String = context.getString(R.string.accessibility_camera_button) override val pickerIconResourceId: Int get() = R.drawable.ic_camera diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt index ef0c9a175141b..16385ec59aa70 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/DoNotDisturbQuickAffordanceConfig.kt @@ -99,7 +99,7 @@ constructor( override val key: String = BuiltInKeyguardQuickAffordanceKeys.DO_NOT_DISTURB - override val pickerName: String = context.getString(R.string.quick_settings_dnd_label) + override fun pickerName(): String = context.getString(R.string.quick_settings_dnd_label) override val pickerIconResourceId: Int = R.drawable.ic_do_not_disturb diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt index 3412f35669e3c..ed8823a53fe2d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/FlashlightQuickAffordanceConfig.kt @@ -75,8 +75,7 @@ constructor( override val key: String get() = BuiltInKeyguardQuickAffordanceKeys.FLASHLIGHT - override val pickerName: String - get() = context.getString(R.string.quick_settings_flashlight_label) + override fun pickerName(): String = context.getString(R.string.quick_settings_flashlight_label) override val pickerIconResourceId: Int get() = R.drawable.ic_flashlight_off diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt index a1e9137d17647..abb63c4d34ce8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/HomeControlsKeyguardQuickAffordanceConfig.kt @@ -54,7 +54,7 @@ constructor( override val key: String = BuiltInKeyguardQuickAffordanceKeys.HOME_CONTROLS - override val pickerName: String by lazy { context.getString(component.getTileTitleId()) } + override fun pickerName(): String = context.getString(component.getTileTitleId()) override val pickerIconResourceId: Int by lazy { component.getTileImageId() } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceConfig.kt index e32edcb010e8d..28dc5bdcc45f1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceConfig.kt @@ -31,8 +31,6 @@ interface KeyguardQuickAffordanceConfig { /** Unique identifier for this quick affordance. It must be globally unique. */ val key: String - val pickerName: String - val pickerIconResourceId: Int /** @@ -42,6 +40,12 @@ interface KeyguardQuickAffordanceConfig { */ val lockScreenState: Flow + /** + * Returns a user-visible [String] that should be shown as the name for the option in the + * wallpaper picker / settings app to select this quick affordance. + */ + fun pickerName(): String + /** * Returns the [PickerScreenState] representing the affordance in the settings or selector * experience. diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt index da91572894f3a..250356819baf0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt @@ -34,6 +34,7 @@ import com.android.systemui.keyguard.shared.quickaffordance.ActivationState import com.android.systemui.settings.UserFileManager import com.android.systemui.settings.UserTracker import com.android.systemui.util.RingerModeTracker +import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose @@ -45,30 +46,32 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import javax.inject.Inject @SysUISingleton -class MuteQuickAffordanceConfig @Inject constructor( - context: Context, - private val userTracker: UserTracker, - private val userFileManager: UserFileManager, - private val ringerModeTracker: RingerModeTracker, - private val audioManager: AudioManager, - @Application private val coroutineScope: CoroutineScope, - @Main private val mainDispatcher: CoroutineDispatcher, - @Background private val backgroundDispatcher: CoroutineDispatcher, +class MuteQuickAffordanceConfig +@Inject +constructor( + private val context: Context, + private val userTracker: UserTracker, + private val userFileManager: UserFileManager, + private val ringerModeTracker: RingerModeTracker, + private val audioManager: AudioManager, + @Application private val coroutineScope: CoroutineScope, + @Main private val mainDispatcher: CoroutineDispatcher, + @Background private val backgroundDispatcher: CoroutineDispatcher, ) : KeyguardQuickAffordanceConfig { private var previousNonSilentMode: Int = DEFAULT_LAST_NON_SILENT_VALUE override val key: String = BuiltInKeyguardQuickAffordanceKeys.MUTE - override val pickerName: String = context.getString(R.string.volume_ringer_status_silent) + override fun pickerName(): String = context.getString(R.string.volume_ringer_status_silent) override val pickerIconResourceId: Int = R.drawable.ic_notifications_silence override val lockScreenState: Flow = - ringerModeTracker.ringerModeInternal.asFlow() + ringerModeTracker.ringerModeInternal + .asFlow() .onStart { getLastNonSilentRingerMode() } .distinctUntilChanged() .onEach { mode -> @@ -78,17 +81,14 @@ class MuteQuickAffordanceConfig @Inject constructor( } } .map { mode -> - val (activationState, contentDescriptionRes) = when { - audioManager.isVolumeFixed -> - ActivationState.NotSupported to - R.string.volume_ringer_hint_mute - mode == AudioManager.RINGER_MODE_SILENT -> - ActivationState.Active to - R.string.volume_ringer_hint_mute - else -> - ActivationState.Inactive to - R.string.volume_ringer_hint_unmute - } + val (activationState, contentDescriptionRes) = + when { + audioManager.isVolumeFixed -> + ActivationState.NotSupported to R.string.volume_ringer_hint_mute + mode == AudioManager.RINGER_MODE_SILENT -> + ActivationState.Active to R.string.volume_ringer_hint_mute + else -> ActivationState.Inactive to R.string.volume_ringer_hint_unmute + } KeyguardQuickAffordanceConfig.LockScreenState.Visible( Icon.Resource( @@ -130,32 +130,35 @@ class MuteQuickAffordanceConfig @Inject constructor( } /** - * Gets the last non-silent ringer mode from shared-preferences if it exists. This is - * cached by [MuteQuickAffordanceCoreStartable] while this affordance is selected + * Gets the last non-silent ringer mode from shared-preferences if it exists. This is cached by + * [MuteQuickAffordanceCoreStartable] while this affordance is selected */ private suspend fun getLastNonSilentRingerMode(): Int = withContext(backgroundDispatcher) { - userFileManager.getSharedPreferences( + userFileManager + .getSharedPreferences( MUTE_QUICK_AFFORDANCE_PREFS_FILE_NAME, Context.MODE_PRIVATE, userTracker.userId - ).getInt( + ) + .getInt( LAST_NON_SILENT_RINGER_MODE_KEY, ringerModeTracker.ringerModeInternal.value ?: DEFAULT_LAST_NON_SILENT_VALUE - ) + ) } private fun LiveData.asFlow(): Flow = conflatedCallbackFlow { - val observer = Observer { value: T -> trySend(value) } - observeForever(observer) - send(value) - awaitClose { removeObserver(observer) } - }.flowOn(mainDispatcher) + val observer = Observer { value: T -> trySend(value) } + observeForever(observer) + send(value) + awaitClose { removeObserver(observer) } + } + .flowOn(mainDispatcher) companion object { const val LAST_NON_SILENT_RINGER_MODE_KEY = "key_last_non_silent_ringer_mode" const val MUTE_QUICK_AFFORDANCE_PREFS_FILE_NAME = "quick_affordance_mute_ringer_mode_cache" private const val DEFAULT_LAST_NON_SILENT_VALUE = AudioManager.RINGER_MODE_NORMAL } -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfig.kt index ea6c107cd161a..0d54ab9adb4a7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QrCodeScannerKeyguardQuickAffordanceConfig.kt @@ -42,7 +42,7 @@ constructor( override val key: String = BuiltInKeyguardQuickAffordanceKeys.QR_CODE_SCANNER - override val pickerName = context.getString(R.string.qr_code_scanner_title) + override fun pickerName(): String = context.getString(R.string.qr_code_scanner_title) override val pickerIconResourceId = R.drawable.ic_qr_code_scanner @@ -53,6 +53,7 @@ constructor( override fun onQRCodeScannerActivityChanged() { trySendWithFailureLogging(state(), TAG) } + override fun onQRCodeScannerPreferenceChanged() { trySendWithFailureLogging(state(), TAG) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt index 12270784adca8..44e74e7e339bf 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/QuickAccessWalletKeyguardQuickAffordanceConfig.kt @@ -51,7 +51,7 @@ constructor( override val key: String = BuiltInKeyguardQuickAffordanceKeys.QUICK_ACCESS_WALLET - override val pickerName: String = context.getString(R.string.accessibility_wallet_button) + override fun pickerName(): String = context.getString(R.string.accessibility_wallet_button) override val pickerIconResourceId = R.drawable.ic_wallet_lockscreen diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfig.kt index 6f821a2b52282..1ccc689da368a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/VideoCameraQuickAffordanceConfig.kt @@ -62,8 +62,7 @@ constructor( override val key: String get() = BuiltInKeyguardQuickAffordanceKeys.VIDEO_CAMERA - override val pickerName: String - get() = context.getString(R.string.video_camera) + override fun pickerName(): String = context.getString(R.string.video_camera) override val pickerIconResourceId: Int get() = R.drawable.ic_videocam diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt index ab4abbf3d5751..96c94d7d64b65 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepository.kt @@ -170,7 +170,7 @@ constructor( pickerState as? KeyguardQuickAffordanceConfig.PickerScreenState.Disabled KeyguardQuickAffordancePickerRepresentation( id = config.key, - name = config.pickerName, + name = config.pickerName(), iconResourceId = config.pickerIconResourceId, isEnabled = pickerState is KeyguardQuickAffordanceConfig.PickerScreenState.Default, @@ -234,7 +234,9 @@ constructor( pw.println(" $slotId$selectionText (capacity = $capacity)") } pw.println("Available affordances on device:") - configs.forEach { config -> pw.println(" ${config.key} (\"${config.pickerName}\")") } + configs.forEach { config -> + pw.println(" ${config.key} (\"${config.pickerName()}\")") + } } } diff --git a/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt index 444407c2341a7..0ce20cdbe63d0 100644 --- a/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/notetask/quickaffordance/NoteTaskQuickAffordanceConfig.kt @@ -73,7 +73,7 @@ constructor( private val pickerNameResourceId = R.string.note_task_button_label - override val pickerName: String = context.getString(pickerNameResourceId) + override fun pickerName(): String = context.getString(pickerNameResourceId) override val pickerIconResourceId = R.drawable.ic_note_task_shortcut_keyguard diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt index 13d1e6488d25e..c85c7f6785365 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/quickaffordance/FakeKeyguardQuickAffordanceConfig.kt @@ -28,7 +28,7 @@ import kotlinx.coroutines.yield @RoboPilotTest class FakeKeyguardQuickAffordanceConfig( override val key: String, - override val pickerName: String = key, + private val pickerName: String = key, override val pickerIconResourceId: Int = 0, ) : KeyguardQuickAffordanceConfig { @@ -41,6 +41,8 @@ class FakeKeyguardQuickAffordanceConfig( override val lockScreenState: Flow = _lockScreenState + override fun pickerName(): String = pickerName + override fun onTriggered( expandable: Expandable?, ): OnTriggeredResult { diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt index ca7c5db478a17..6b5be58b6d030 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardQuickAffordanceRepositoryTest.kt @@ -189,12 +189,12 @@ class KeyguardQuickAffordanceRepositoryTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = config1.key, - name = config1.pickerName, + name = config1.pickerName(), iconResourceId = config1.pickerIconResourceId, ), KeyguardQuickAffordancePickerRepresentation( id = config2.key, - name = config2.pickerName, + name = config2.pickerName(), iconResourceId = config2.pickerIconResourceId, ), ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt index 895c1cd5a1a19..1d5971ce9adcd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorTest.kt @@ -435,7 +435,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = homeControls.key, - name = homeControls.pickerName, + name = homeControls.pickerName(), iconResourceId = homeControls.pickerIconResourceId, ), ), @@ -469,7 +469,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = quickAccessWallet.key, - name = quickAccessWallet.pickerName, + name = quickAccessWallet.pickerName(), iconResourceId = quickAccessWallet.pickerIconResourceId, ), ), @@ -506,7 +506,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = quickAccessWallet.key, - name = quickAccessWallet.pickerName, + name = quickAccessWallet.pickerName(), iconResourceId = quickAccessWallet.pickerIconResourceId, ), ), @@ -514,7 +514,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = qrCodeScanner.key, - name = qrCodeScanner.pickerName, + name = qrCodeScanner.pickerName(), iconResourceId = qrCodeScanner.pickerIconResourceId, ), ), @@ -570,7 +570,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = quickAccessWallet.key, - name = quickAccessWallet.pickerName, + name = quickAccessWallet.pickerName(), iconResourceId = quickAccessWallet.pickerIconResourceId, ), ), @@ -665,7 +665,7 @@ class KeyguardQuickAffordanceInteractorTest : SysuiTestCase() { listOf( KeyguardQuickAffordancePickerRepresentation( id = quickAccessWallet.key, - name = quickAccessWallet.pickerName, + name = quickAccessWallet.pickerName(), iconResourceId = quickAccessWallet.pickerIconResourceId, ), ),