From 90c39f525351776794c2c8544305cd041ea2c315 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jun 2023 09:44:38 +0200 Subject: [PATCH 1/8] Introduce handy aliases to avoid writing this: `import io.element.android.libraries.ui.strings.R as StringR` --- .../libraries/ui/strings/CommonPlurals.kt | 19 +++++++++++++++++++ .../libraries/ui/strings/CommonStrings.kt | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonPlurals.kt create mode 100644 libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonStrings.kt diff --git a/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonPlurals.kt b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonPlurals.kt new file mode 100644 index 0000000000..ea5697056e --- /dev/null +++ b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonPlurals.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * 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 io.element.android.libraries.ui.strings + +typealias CommonPlurals = R.plurals diff --git a/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonStrings.kt b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonStrings.kt new file mode 100644 index 0000000000..1d6bf3e1d4 --- /dev/null +++ b/libraries/ui-strings/src/main/kotlin/io/element/android/libraries/ui/strings/CommonStrings.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * 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 io.element.android.libraries.ui.strings + +typealias CommonStrings = R.string From 4a8c49fa283eee1e7a919e1e4935494c5dce0bd7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jun 2023 09:42:28 +0200 Subject: [PATCH 2/8] Use `CommonStrings` everywhere --- .../preferences/AnalyticsPreferencesView.kt | 10 +++++----- .../analytics/impl/AnalyticsOptInView.kt | 6 +++--- .../impl/addpeople/AddPeopleView.kt | 4 ++-- .../impl/configureroom/ConfigureRoomView.kt | 10 +++++----- .../impl/root/CreateRoomRootView.kt | 10 +++++----- .../invitelist/impl/InviteListView.kt | 20 +++++++++---------- .../impl/components/InviteSummaryRow.kt | 6 +++--- .../features/leaveroom/api/LeaveRoomView.kt | 12 +++++------ .../dialogs/SlidingSyncNotSupportedDialog.kt | 6 +++--- .../login/impl/error/ErrorFormatter.kt | 6 +++--- .../loginpassword/LoginPasswordView.kt | 6 +++--- .../SearchAccountProviderView.kt | 4 ++-- .../login/impl/error/ErrorFormatterTests.kt | 8 ++++---- .../logout/api/LogoutPreferenceScreen.kt | 4 ++-- .../impl/forward/ForwardMessagesView.kt | 8 ++++---- .../impl/media/viewer/MediaViewerPresenter.kt | 6 +++--- .../impl/media/viewer/MediaViewerView.kt | 10 +++++----- .../impl/report/ReportMessagePresenter.kt | 4 ++-- .../messages/impl/report/ReportMessageView.kt | 16 +++++++-------- .../event/TimelineItemEncryptedView.kt | 7 +++---- .../event/TimelineItemRedactedView.kt | 7 +++---- .../event/TimelineItemUnknownView.kt | 7 +++---- .../api/ui/ConnectivityIndicatorView.kt | 4 ++-- .../impl/root/PreferencesRootView.kt | 8 ++++---- .../rageshake/api/crash/CrashDetectionView.kt | 8 ++++---- .../api/detection/RageshakeDetectionView.kt | 10 +++++----- .../preferences/RageshakePreferencesView.kt | 14 ++++++------- .../rageshake/impl/bugreport/BugReportView.kt | 6 +++--- .../roomdetails/impl/RoomDetailsView.kt | 6 +++--- .../impl/edit/RoomDetailsEditView.kt | 10 +++++----- .../impl/invite/RoomInviteMembersNode.kt | 6 +++--- .../impl/invite/RoomInviteMembersView.kt | 6 +++--- .../impl/members/RoomMemberListView.kt | 6 +++--- .../members/details/RoomMemberDetailsView.kt | 6 +++--- .../roomlist/impl/RoomListContextMenu.kt | 10 +++++----- .../roomlist/impl/RoomListStateProvider.kt | 4 ++-- .../features/roomlist/impl/RoomListView.kt | 8 ++++---- .../impl/components/RoomListTopBar.kt | 6 +++--- .../impl/VerifySelfSessionView.kt | 6 +++--- .../components/async/AsyncFailure.kt | 6 +++--- .../components/button/BackButton.kt | 4 ++-- .../components/dialogs/ConfirmationDialog.kt | 6 +++--- .../components/dialogs/ErrorDialog.kt | 6 +++--- .../components/dialogs/RetryDialog.kt | 8 ++++---- .../impl/DefaultRoomLastMessageFormatter.kt | 18 ++++++++--------- .../impl/StateContentFormatter.kt | 4 ++-- .../matrix/ui/components/SelectedRoom.kt | 4 ++-- .../matrix/ui/components/SelectedUser.kt | 4 ++-- .../libraries/textcomposer/TextComposer.kt | 12 +++++------ 49 files changed, 185 insertions(+), 188 deletions(-) diff --git a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt index d656547631..4ece980969 100644 --- a/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt +++ b/features/analytics/api/src/main/kotlin/io/element/android/features/analytics/api/preferences/AnalyticsPreferencesView.kt @@ -32,7 +32,7 @@ import io.element.android.libraries.designsystem.components.preferences.Preferen import io.element.android.libraries.designsystem.components.preferences.PreferenceSwitch import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun AnalyticsPreferencesView( @@ -43,11 +43,11 @@ fun AnalyticsPreferencesView( state.eventSink(AnalyticsOptInEvents.EnableAnalytics(isEnabled = isEnabled)) } - PreferenceCategory(title = stringResource(id = StringR.string.screen_analytics_settings_share_data)) { - val firstPart = stringResource(id = StringR.string.screen_analytics_settings_help_us_improve, state.applicationName) + PreferenceCategory(title = stringResource(id = CommonStrings.screen_analytics_settings_share_data)) { + val firstPart = stringResource(id = CommonStrings.screen_analytics_settings_help_us_improve, state.applicationName) val secondPart = buildAnnotatedStringWithColoredPart( - StringR.string.screen_analytics_settings_read_terms, - StringR.string.screen_analytics_settings_read_terms_content_link + CommonStrings.screen_analytics_settings_read_terms, + CommonStrings.screen_analytics_settings_read_terms_content_link ) val title = "$firstPart\n\n$secondPart" diff --git a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt index e2af75ceca..b71c025359 100644 --- a/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt +++ b/features/analytics/impl/src/main/kotlin/io/element/android/features/analytics/impl/AnalyticsOptInView.kt @@ -61,7 +61,7 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.designsystem.utils.LogCompositions -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun AnalyticsOptInView( @@ -199,13 +199,13 @@ private fun AnalyticsOptInFooter( onClick = { eventSink(AnalyticsOptInEvents.EnableAnalytics(true)) }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(id = StringR.string.action_ok)) + Text(text = stringResource(id = CommonStrings.action_ok)) } TextButton( onClick = { eventSink(AnalyticsOptInEvents.EnableAnalytics(false)) }, modifier = Modifier.fillMaxWidth(), ) { - Text(text = stringResource(id = StringR.string.action_not_now)) + Text(text = stringResource(id = CommonStrings.action_not_now)) } } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt index c64c1efc75..9ba9a314e9 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt @@ -42,7 +42,7 @@ import io.element.android.libraries.designsystem.theme.components.CenterAlignedT import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalLayoutApi::class) @Composable @@ -107,7 +107,7 @@ fun AddPeopleViewTopBar( modifier = Modifier.padding(horizontal = 8.dp), onClick = onNextPressed, ) { - val textActionResId = if (hasSelectedUsers) StringR.string.action_next else StringR.string.action_skip + val textActionResId = if (hasSelectedUsers) CommonStrings.action_next else CommonStrings.action_skip Text( text = stringResource(id = textActionResId), fontSize = 16.sp, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt index 703fa268e2..9f5330bf6f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt @@ -65,8 +65,8 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.ui.components.AvatarActionBottomSheet import io.element.android.libraries.matrix.ui.components.SelectedUsersList import io.element.android.libraries.matrix.ui.components.UnsavedAvatar +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.launch -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalLayoutApi::class, ExperimentalMaterialApi::class) @Composable @@ -158,7 +158,7 @@ fun ConfigureRoomView( when (state.createRoomAction) { is Async.Loading -> { - ProgressDialog(text = stringResource(StringR.string.common_creating_room)) + ProgressDialog(text = stringResource(CommonStrings.common_creating_room)) } is Async.Failure -> { @@ -198,7 +198,7 @@ fun ConfigureRoomToolbar( onClick = onNextPressed, ) { Text( - text = stringResource(StringR.string.action_create), + text = stringResource(CommonStrings.action_create), fontSize = 16.sp, ) } @@ -227,7 +227,7 @@ fun RoomNameWithAvatar( LabelledTextField( label = stringResource(R.string.screen_create_room_room_name_label), value = roomName, - placeholder = stringResource(StringR.string.common_room_name_placeholder), + placeholder = stringResource(CommonStrings.common_room_name_placeholder), singleLine = true, onValueChange = onRoomNameChanged, ) @@ -244,7 +244,7 @@ fun RoomTopic( modifier = modifier, label = stringResource(R.string.screen_create_room_topic_label), value = topic, - placeholder = stringResource(StringR.string.common_topic_placeholder), + placeholder = stringResource(CommonStrings.common_topic_placeholder), onValueChange = onTopicChanged, maxLines = 3, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt index 1265243c50..7d3edf8cc9 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt @@ -54,8 +54,8 @@ import io.element.android.libraries.designsystem.theme.components.IconButton import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.designsystem.R as DrawableR -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalLayoutApi::class) @Composable @@ -107,7 +107,7 @@ fun CreateRoomRootView( when (state.startDmAction) { is Async.Loading -> { - ProgressDialog(text = stringResource(id = StringR.string.common_starting_chat)) + ProgressDialog(text = stringResource(id = CommonStrings.common_starting_chat)) } is Async.Failure -> { @@ -137,7 +137,7 @@ fun CreateRoomRootViewTopBar( modifier = modifier, title = { Text( - text = stringResource(id = StringR.string.action_start_chat), + text = stringResource(id = CommonStrings.action_start_chat), fontSize = 16.sp, fontWeight = FontWeight.SemiBold, ) @@ -146,7 +146,7 @@ fun CreateRoomRootViewTopBar( IconButton(onClick = onClosePressed) { Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(id = StringR.string.action_close), + contentDescription = stringResource(id = CommonStrings.action_close), tint = MaterialTheme.colorScheme.primary, ) } @@ -169,7 +169,7 @@ fun CreateRoomActionButtonsList( ) CreateRoomActionButton( iconRes = DrawableR.drawable.ic_share, - text = stringResource(id = StringR.string.action_invite_friends_to_app, state.applicationName), + text = stringResource(id = CommonStrings.action_invite_friends_to_app, state.applicationName), onClick = onInvitePeopleClicked, ) } diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt index 5ef0402055..3bd57bf6aa 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt @@ -47,7 +47,7 @@ import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun InviteListView( @@ -82,8 +82,8 @@ fun InviteListView( ConfirmationDialog( content = stringResource(contentResource, state.declineConfirmationDialog.name), title = stringResource(titleResource), - submitText = stringResource(StringR.string.action_decline), - cancelText = stringResource(StringR.string.action_cancel), + submitText = stringResource(CommonStrings.action_decline), + cancelText = stringResource(CommonStrings.action_cancel), emphasizeSubmitButton = true, onSubmitClicked = { state.eventSink(InviteListEvents.ConfirmDeclineInvite) }, onDismiss = { state.eventSink(InviteListEvents.CancelDeclineInvite) } @@ -92,18 +92,18 @@ fun InviteListView( if (state.acceptedAction is Async.Failure) { ErrorDialog( - content = stringResource(StringR.string.error_unknown), - title = stringResource(StringR.string.common_error), - submitText = stringResource(StringR.string.action_ok), + content = stringResource(CommonStrings.error_unknown), + title = stringResource(CommonStrings.common_error), + submitText = stringResource(CommonStrings.action_ok), onDismiss = { state.eventSink(InviteListEvents.DismissAcceptError) } ) } if (state.declinedAction is Async.Failure) { ErrorDialog( - content = stringResource(StringR.string.error_unknown), - title = stringResource(StringR.string.common_error), - submitText = stringResource(StringR.string.action_ok), + content = stringResource(CommonStrings.error_unknown), + title = stringResource(CommonStrings.common_error), + submitText = stringResource(CommonStrings.action_ok), onDismiss = { state.eventSink(InviteListEvents.DismissDeclineError) } ) } @@ -124,7 +124,7 @@ fun InviteListContent( BackButton(onClick = onBackClicked) }, title = { - Text(text = stringResource(StringR.string.action_invites_list)) + Text(text = stringResource(CommonStrings.action_invites_list)) } ) }, diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/components/InviteSummaryRow.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/components/InviteSummaryRow.kt index fde6ee929f..ba5497e2bc 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/components/InviteSummaryRow.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/components/InviteSummaryRow.kt @@ -61,7 +61,7 @@ import io.element.android.libraries.designsystem.theme.components.OutlinedButton import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.noFontPadding import io.element.android.libraries.designsystem.theme.roomListUnreadIndicator -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings private val minHeight = 72.dp @@ -143,7 +143,7 @@ internal fun DefaultInviteSummaryRow( // CTAs Row(Modifier.padding(top = 12.dp)) { OutlinedButton( - content = { Text(stringResource(StringR.string.action_decline), style = ElementTextStyles.Button) }, + content = { Text(stringResource(CommonStrings.action_decline), style = ElementTextStyles.Button) }, onClick = onDeclineClicked, modifier = Modifier.weight(1f).heightIn(max = 36.dp), contentPadding = PaddingValues(horizontal = 24.dp, vertical = 0.dp), @@ -152,7 +152,7 @@ internal fun DefaultInviteSummaryRow( Spacer(modifier = Modifier.width(12.dp)) Button( - content = { Text(stringResource(StringR.string.action_accept), style = ElementTextStyles.Button) }, + content = { Text(stringResource(CommonStrings.action_accept), style = ElementTextStyles.Button) }, onClick = onAcceptClicked, modifier = Modifier.weight(1f).heightIn(max = 36.dp), contentPadding = PaddingValues(horizontal = 24.dp, vertical = 0.dp), diff --git a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt index d1746ca917..9a3a86a94c 100644 --- a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt +++ b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt @@ -32,7 +32,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.ui.strings.R -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun LeaveRoomView( @@ -50,19 +50,19 @@ private fun LeaveRoomConfirmationDialog( when (state.confirmation) { is LeaveRoomState.Confirmation.Hidden -> {} is LeaveRoomState.Confirmation.PrivateRoom -> LeaveRoomConfirmationDialog( - text = StringR.string.leave_room_alert_private_subtitle, + text = CommonStrings.leave_room_alert_private_subtitle, roomId = state.confirmation.roomId, eventSink = state.eventSink, ) is LeaveRoomState.Confirmation.LastUserInRoom -> LeaveRoomConfirmationDialog( - text = StringR.string.leave_room_alert_empty_subtitle, + text = CommonStrings.leave_room_alert_empty_subtitle, roomId = state.confirmation.roomId, eventSink = state.eventSink, ) is LeaveRoomState.Confirmation.Generic -> LeaveRoomConfirmationDialog( - text = StringR.string.leave_room_alert_subtitle, + text = CommonStrings.leave_room_alert_subtitle, roomId = state.confirmation.roomId, eventSink = state.eventSink, ) @@ -90,7 +90,7 @@ private fun LeaveRoomProgressDialog( when (state.progress) { is LeaveRoomState.Progress.Hidden -> {} is LeaveRoomState.Progress.Shown -> ProgressDialog( - text = stringResource(StringR.string.common_leaving_room), + text = stringResource(CommonStrings.common_leaving_room), ) } } @@ -102,7 +102,7 @@ private fun LeaveRoomErrorDialog( when (state.error) { is LeaveRoomState.Error.Hidden -> {} is LeaveRoomState.Error.Shown -> ErrorDialog( - content = stringResource(StringR.string.error_unknown), + content = stringResource(CommonStrings.error_unknown), onDismiss = { state.eventSink(LeaveRoomEvent.HideError) } ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/dialogs/SlidingSyncNotSupportedDialog.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/dialogs/SlidingSyncNotSupportedDialog.kt index 32eb1b0824..5beb14b0b4 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/dialogs/SlidingSyncNotSupportedDialog.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/dialogs/SlidingSyncNotSupportedDialog.kt @@ -21,7 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import io.element.android.features.login.impl.R import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun SlidingSyncNotSupportedDialog( @@ -32,11 +32,11 @@ internal fun SlidingSyncNotSupportedDialog( ConfirmationDialog( modifier = modifier, onDismiss = onDismiss, - submitText = stringResource(StringR.string.action_learn_more), + submitText = stringResource(CommonStrings.action_learn_more), onSubmitClicked = onLearnMoreClicked, onCancelClicked = onDismiss, emphasizeSubmitButton = true, - title = stringResource(StringR.string.dialog_title_error), + title = stringResource(CommonStrings.dialog_title_error), content = stringResource(R.string.screen_change_server_error_no_sliding_sync_message), ) } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt index ec2dc95386..15d5e616de 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ErrorFormatter.kt @@ -21,16 +21,16 @@ import io.element.android.features.login.impl.R import io.element.android.libraries.matrix.api.auth.AuthErrorCode import io.element.android.libraries.matrix.api.auth.AuthenticationException import io.element.android.libraries.matrix.api.auth.errorCode -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @StringRes fun loginError( throwable: Throwable ): Int { - val authException = throwable as? AuthenticationException ?: return StringR.string.error_unknown + val authException = throwable as? AuthenticationException ?: return CommonStrings.error_unknown return when (authException.errorCode) { AuthErrorCode.FORBIDDEN -> R.string.screen_login_error_invalid_credentials AuthErrorCode.USER_DEACTIVATED -> R.string.screen_login_error_deactivated_account - AuthErrorCode.UNKNOWN -> StringR.string.error_unknown + AuthErrorCode.UNKNOWN -> CommonStrings.error_unknown } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt index 9154a0792f..9d6fe7d1ea 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/loginpassword/LoginPasswordView.kt @@ -76,7 +76,7 @@ import io.element.android.libraries.designsystem.theme.components.autofill import io.element.android.libraries.designsystem.theme.components.onTabOrEnterKeyFocusNext import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -213,7 +213,7 @@ internal fun LoginForm( IconButton(onClick = { loginFieldState = "" }) { - Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(StringR.string.action_clear)) + Icon(imageVector = Icons.Filled.Close, contentDescription = stringResource(CommonStrings.action_clear)) } } } else null, @@ -248,7 +248,7 @@ internal fun LoginForm( val image = if (passwordVisible) Icons.Filled.Visibility else Icons.Filled.VisibilityOff val description = - if (passwordVisible) stringResource(StringR.string.a11y_hide_password) else stringResource(StringR.string.a11y_show_password) + if (passwordVisible) stringResource(CommonStrings.a11y_hide_password) else stringResource(CommonStrings.a11y_show_password) IconButton(onClick = { passwordVisible = !passwordVisible }) { Icon(imageVector = image, description) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt index 5c280cba0e..9852b78e3c 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt @@ -72,7 +72,7 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.onTabOrEnterKeyFocusNext import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings /** * https://www.figma.com/file/o9p34zmiuEpZRyvZXJZAYL/FTUE?type=design&node-id=611-61435 @@ -143,7 +143,7 @@ fun SearchAccountProviderView( }) { Icon( imageVector = Icons.Filled.Close, - contentDescription = stringResource(StringR.string.action_clear) + contentDescription = stringResource(CommonStrings.action_clear) ) } } diff --git a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/error/ErrorFormatterTests.kt b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/error/ErrorFormatterTests.kt index 9bc8467bb1..c1d7e5bb6c 100644 --- a/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/error/ErrorFormatterTests.kt +++ b/features/login/impl/src/test/kotlin/io/element/android/features/login/impl/error/ErrorFormatterTests.kt @@ -19,8 +19,8 @@ package io.element.android.features.login.impl.error import com.google.common.truth.Truth.assertThat import io.element.android.features.login.impl.R import io.element.android.libraries.matrix.api.auth.AuthenticationException +import io.element.android.libraries.ui.strings.CommonStrings import org.junit.Test -import io.element.android.libraries.ui.strings.R as StringR class ErrorFormatterTests { @@ -28,19 +28,19 @@ class ErrorFormatterTests { @Test fun `loginError - invalid unknown error returns unknown error message`() { val error = Throwable("Some unknown error") - assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown) + assertThat(loginError(error)).isEqualTo(CommonStrings.error_unknown) } @Test fun `loginError - invalid auth error returns unknown error message`() { val error = AuthenticationException.SlidingSyncNotAvailable("Some message. Also contains M_FORBIDDEN, but won't be parsed") - assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown) + assertThat(loginError(error)).isEqualTo(CommonStrings.error_unknown) } @Test fun `loginError - unknown error returns unknown error message`() { val error = AuthenticationException.Generic("M_UNKNOWN") - assertThat(loginError(error)).isEqualTo(StringR.string.error_unknown) + assertThat(loginError(error)).isEqualTo(CommonStrings.error_unknown) } @Test diff --git a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutPreferenceScreen.kt b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutPreferenceScreen.kt index a90d98d26b..343bef4498 100644 --- a/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutPreferenceScreen.kt +++ b/features/logout/api/src/main/kotlin/io/element/android/features/logout/api/LogoutPreferenceScreen.kt @@ -31,7 +31,7 @@ import io.element.android.libraries.designsystem.components.preferences.Preferen import io.element.android.libraries.designsystem.components.preferences.PreferenceText import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun LogoutPreferenceView( @@ -81,7 +81,7 @@ fun LogoutPreferenceView( fun LogoutPreferenceContent( onClick: () -> Unit = {}, ) { - PreferenceCategory(title = stringResource(id = StringR.string.settings_title_general)) { + PreferenceCategory(title = stringResource(id = CommonStrings.settings_title_general)) { PreferenceText( title = stringResource(id = R.string.screen_signout_preference_item), icon = Icons.Default.Logout, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesView.kt index 329aff2881..3ba84cd8d5 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesView.kt @@ -66,8 +66,8 @@ import io.element.android.libraries.designsystem.theme.roomListRoomName import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.RoomSummaryDetails import io.element.android.libraries.matrix.ui.components.SelectedRoom +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -111,7 +111,7 @@ fun ForwardMessagesView( modifier = modifier, topBar = { CenterAlignedTopAppBar( - title = { Text(stringResource(StringR.string.common_forward_message), style = ElementTextStyles.Bold.callout) }, + title = { Text(stringResource(CommonStrings.common_forward_message), style = ElementTextStyles.Bold.callout) }, navigationIcon = { BackButton(onClick = { onBackButton(state) }) }, @@ -120,7 +120,7 @@ fun ForwardMessagesView( enabled = state.selectedRooms.isNotEmpty(), onClick = { state.eventSink(ForwardMessagesEvents.ForwardEvent) } ) { - Text(text = stringResource(StringR.string.action_send)) + Text(text = stringResource(CommonStrings.action_send)) } } ) @@ -132,7 +132,7 @@ fun ForwardMessagesView( .consumeWindowInsets(paddingValues) ) { SearchBar>( - placeHolderTitle = stringResource(StringR.string.action_search), + placeHolderTitle = stringResource(CommonStrings.action_search), query = state.query, onQueryChange = { state.eventSink(ForwardMessagesEvents.UpdateQuery(it)) }, active = state.isSearchActive, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt index 5ef1bdcd47..9ea25336e9 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt @@ -38,10 +38,10 @@ import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.designsystem.utils.collectSnackbarMessageAsState import io.element.android.libraries.matrix.api.media.MatrixMediaLoader import io.element.android.libraries.matrix.api.media.MediaFile +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import io.element.android.libraries.androidutils.R as UtilsR -import io.element.android.libraries.ui.strings.R as StringR class MediaViewerPresenter @AssistedInject constructor( @Assisted private val inputs: MediaViewerNode.Inputs, @@ -119,7 +119,7 @@ class MediaViewerPresenter @AssistedInject constructor( if (localMedia is Async.Success) { localMediaActions.saveOnDisk(localMedia.state) .onSuccess { - val snackbarMessage = SnackbarMessage(StringR.string.common_file_saved_on_disk_android) + val snackbarMessage = SnackbarMessage(CommonStrings.common_file_saved_on_disk_android) snackbarDispatcher.post(snackbarMessage) } .onFailure { @@ -153,7 +153,7 @@ class MediaViewerPresenter @AssistedInject constructor( return if (throwable is ActivityNotFoundException) { UtilsR.string.error_no_compatible_app_found } else { - StringR.string.error_unknown + CommonStrings.error_unknown } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt index 9cc1ed69fd..774b7843a5 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt @@ -69,8 +69,8 @@ import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.utils.rememberSnackbarHostState import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.ui.media.MediaRequestData +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.delay -import io.element.android.libraries.ui.strings.R as StringR @Composable fun MediaViewerView( @@ -131,7 +131,7 @@ fun MediaViewerView( ) { if (state.downloadedMedia is Async.Failure) { ErrorView( - errorMessage = stringResource(id = StringR.string.error_unknown), + errorMessage = stringResource(id = CommonStrings.error_unknown), onRetry = ::onRetry, onDismiss = ::onDismissError ) @@ -188,7 +188,7 @@ private fun MediaViewerTopBar( eventSink(MediaViewerEvents.OpenWith) }, ) { - Icon(imageVector = Icons.Default.OpenInNew, contentDescription = stringResource(id = StringR.string.action_open_with)) + Icon(imageVector = Icons.Default.OpenInNew, contentDescription = stringResource(id = CommonStrings.action_open_with)) } IconButton( enabled = actionsEnabled, @@ -196,7 +196,7 @@ private fun MediaViewerTopBar( eventSink(MediaViewerEvents.SaveOnDisk) }, ) { - Icon(imageVector = Icons.Default.Download, contentDescription = stringResource(id = StringR.string.action_save)) + Icon(imageVector = Icons.Default.Download, contentDescription = stringResource(id = CommonStrings.action_save)) } IconButton( enabled = actionsEnabled, @@ -204,7 +204,7 @@ private fun MediaViewerTopBar( eventSink(MediaViewerEvents.Share) }, ) { - Icon(imageVector = Icons.Default.Share, contentDescription = stringResource(id = StringR.string.action_share)) + Icon(imageVector = Icons.Default.Share, contentDescription = stringResource(id = CommonStrings.action_share)) } } ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt index 09cad8e33b..e30c3eb740 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt @@ -36,9 +36,9 @@ import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch -import io.element.android.libraries.ui.strings.R as StringR class ReportMessagePresenter @AssistedInject constructor( private val room: MatrixRoom, @@ -91,7 +91,7 @@ class ReportMessagePresenter @AssistedInject constructor( val userIdToBlock = userId.takeIf { blockUser } room.reportContent(eventId, reason, userIdToBlock) .onSuccess { - snackbarDispatcher.post(SnackbarMessage(StringR.string.common_report_submitted)) + snackbarDispatcher.post(SnackbarMessage(CommonStrings.common_report_submitted)) } }.executeResult(result) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt index 1beee54519..325ece7f14 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt @@ -54,7 +54,7 @@ import io.element.android.libraries.designsystem.theme.components.CenterAlignedT import io.element.android.libraries.designsystem.theme.components.OutlinedTextField import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -74,7 +74,7 @@ fun ReportMessageView( } is Async.Failure -> { ErrorDialog( - content = stringResource(StringR.string.error_unknown), + content = stringResource(CommonStrings.error_unknown), onDismiss = { state.eventSink(ReportMessageEvents.ClearError) } ) } @@ -86,7 +86,7 @@ fun ReportMessageView( CenterAlignedTopAppBar( title = { Text( - stringResource(StringR.string.action_report_content), + stringResource(CommonStrings.action_report_content), style = ElementTextStyles.Regular.callout, fontWeight = FontWeight.Medium, ) @@ -112,14 +112,14 @@ fun ReportMessageView( OutlinedTextField( value = state.reason, onValueChange = { state.eventSink(ReportMessageEvents.UpdateReason(it)) }, - placeholder = { Text(stringResource(StringR.string.report_content_hint)) }, + placeholder = { Text(stringResource(CommonStrings.report_content_hint)) }, enabled = !isSending, modifier = Modifier .fillMaxWidth() .heightIn(min = 90.dp) ) Text( - text = stringResource(StringR.string.report_content_explanation), + text = stringResource(CommonStrings.report_content_explanation), style = ElementTextStyles.Regular.caption1, color = MaterialTheme.colorScheme.secondary, textAlign = TextAlign.Start, @@ -133,11 +133,11 @@ fun ReportMessageView( ) { Column(modifier = Modifier.weight(1f), verticalArrangement = Arrangement.spacedBy(4.dp)) { Text( - text = stringResource(StringR.string.screen_report_content_block_user), + text = stringResource(CommonStrings.screen_report_content_block_user), style = ElementTextStyles.Regular.callout, ) Text( - text = stringResource(StringR.string.screen_report_content_block_user_hint), + text = stringResource(CommonStrings.screen_report_content_block_user_hint), style = ElementTextStyles.Regular.bodyMD, color = MaterialTheme.colorScheme.secondary, ) @@ -152,7 +152,7 @@ fun ReportMessageView( Spacer(modifier = Modifier.height(24.dp)) ButtonWithProgress( - text = stringResource(StringR.string.action_send), + text = stringResource(CommonStrings.action_send), enabled = state.reason.isNotBlank() && !isSending, showProgress = isSending, onClick = { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index 0bb3863a5c..83015ecae4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -26,8 +26,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent - -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineItemEncryptedView( @@ -35,8 +34,8 @@ fun TimelineItemEncryptedView( modifier: Modifier = Modifier ) { TimelineItemInformativeView( - text = stringResource(id = StringR.string.common_decryption_error), - iconDescription = stringResource(id = StringR.string.dialog_title_warning), + text = stringResource(id = CommonStrings.common_decryption_error), + iconDescription = stringResource(id = CommonStrings.dialog_title_warning), icon = Icons.Default.Warning, modifier = modifier ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemRedactedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemRedactedView.kt index c8680cb6cc..846c3af63b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemRedactedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemRedactedView.kt @@ -25,8 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview import io.element.android.features.messages.impl.timeline.model.event.TimelineItemRedactedContent import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight - -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineItemRedactedView( @@ -34,8 +33,8 @@ fun TimelineItemRedactedView( modifier: Modifier = Modifier ) { TimelineItemInformativeView( - text = stringResource(id = StringR.string.common_message_removed), - iconDescription = stringResource(id = StringR.string.common_message_removed), + text = stringResource(id = CommonStrings.common_message_removed), + iconDescription = stringResource(id = CommonStrings.common_message_removed), icon = Icons.Default.Delete, modifier = modifier ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemUnknownView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemUnknownView.kt index 11f14b2236..7875da5fbe 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemUnknownView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemUnknownView.kt @@ -25,8 +25,7 @@ import androidx.compose.ui.tooling.preview.Preview import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight - -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineItemUnknownView( @@ -34,8 +33,8 @@ fun TimelineItemUnknownView( modifier: Modifier = Modifier ) { TimelineItemInformativeView( - text = stringResource(id = StringR.string.common_unsupported_event), - iconDescription = stringResource(id = StringR.string.dialog_title_warning), + text = stringResource(id = CommonStrings.common_unsupported_event), + iconDescription = stringResource(id = CommonStrings.dialog_title_warning), icon = Icons.Default.Info, modifier = modifier ) diff --git a/features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicatorView.kt b/features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicatorView.kt index 445c7a48ae..dd76598215 100644 --- a/features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicatorView.kt +++ b/features/networkmonitor/api/src/main/kotlin/io/element/android/features/networkmonitor/api/ui/ConnectivityIndicatorView.kt @@ -49,7 +49,7 @@ import io.element.android.libraries.designsystem.ElementTextStyles import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.LocalColors -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun ConnectivityIndicatorView( @@ -98,7 +98,7 @@ private fun Indicator(modifier: Modifier = Modifier) { ) Spacer(modifier = Modifier.width(8.dp)) Text( - text = stringResource(StringR.string.common_offline), + text = stringResource(CommonStrings.common_offline), style = ElementTextStyles.Regular.bodyMD.copy(fontWeight = FontWeight.Medium), color = tint, ) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt index cbdcd13a15..6d6545d838 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/root/PreferencesRootView.kt @@ -35,7 +35,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.preview.LargeHeightPreview import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.MatrixUserProvider -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun PreferencesRootView( @@ -50,7 +50,7 @@ fun PreferencesRootView( PreferenceView( modifier = modifier, onBackPressed = onBackPressed, - title = stringResource(id = StringR.string.common_settings) + title = stringResource(id = CommonStrings.common_settings) ) { UserPreferences(state.myUser) AnalyticsPreferencesView( @@ -71,9 +71,9 @@ fun PreferencesRootView( @Composable fun DeveloperPreferencesView(onOpenDeveloperSettings: () -> Unit) { - PreferenceCategory(title = stringResource(id = StringR.string.common_developer_options)) { + PreferenceCategory(title = stringResource(id = CommonStrings.common_developer_options)) { PreferenceText( - title = stringResource(id = StringR.string.common_developer_options), + title = stringResource(id = CommonStrings.common_developer_options), icon = Icons.Default.DeveloperMode, onClick = onOpenDeveloperSettings ) diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt index 16d08f84e5..a3350d87e4 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/crash/CrashDetectionView.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.designsystem.components.dialogs.Confirmation import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.utils.LogCompositions -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun CrashDetectionView( @@ -56,10 +56,10 @@ fun CrashDetectionContent( onDismiss: () -> Unit = { }, ) { ConfirmationDialog( - title = stringResource(id = StringR.string.action_report_bug), + title = stringResource(id = CommonStrings.action_report_bug), content = stringResource(id = R.string.crash_detection_dialog_content, /* TODO App name */ "Element"), - submitText = stringResource(id = StringR.string.action_yes), - cancelText = stringResource(id = StringR.string.action_no), + submitText = stringResource(id = CommonStrings.action_yes), + cancelText = stringResource(id = CommonStrings.action_no), onCancelClicked = onNoClicked, onSubmitClicked = onYesClicked, onDismiss = onDismiss, diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionView.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionView.kt index 2d89ac1f7d..d1203cb9b1 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionView.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/detection/RageshakeDetectionView.kt @@ -32,7 +32,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.designsystem.utils.OnLifecycleEvent -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun RageshakeDetectionView( @@ -88,11 +88,11 @@ fun RageshakeDialogContent( onYesClicked: () -> Unit = { }, ) { ConfirmationDialog( - title = stringResource(id = StringR.string.action_report_bug), + title = stringResource(id = CommonStrings.action_report_bug), content = stringResource(id = R.string.rageshake_detection_dialog_content), - thirdButtonText = stringResource(id = StringR.string.action_disable), - submitText = stringResource(id = StringR.string.action_yes), - cancelText = stringResource(id = StringR.string.action_no), + thirdButtonText = stringResource(id = CommonStrings.action_disable), + submitText = stringResource(id = CommonStrings.action_yes), + cancelText = stringResource(id = CommonStrings.action_no), onCancelClicked = onNoClicked, onThirdButtonClicked = onDisableClicked, onSubmitClicked = onYesClicked, diff --git a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt index e4be9b91fb..d775bce275 100644 --- a/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt +++ b/features/rageshake/api/src/main/kotlin/io/element/android/features/rageshake/api/preferences/RageshakePreferencesView.kt @@ -30,7 +30,7 @@ import io.element.android.libraries.designsystem.components.preferences.Preferen import io.element.android.libraries.designsystem.components.preferences.PreferenceText import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun RageshakePreferencesView( @@ -47,23 +47,23 @@ fun RageshakePreferencesView( } Column(modifier = modifier) { - PreferenceCategory(title = stringResource(id = StringR.string.action_report_bug)) { + PreferenceCategory(title = stringResource(id = CommonStrings.action_report_bug)) { PreferenceText( - title = stringResource(id = StringR.string.action_report_bug), + title = stringResource(id = CommonStrings.action_report_bug), icon = Icons.Default.BugReport, onClick = onOpenRageshake ) } - PreferenceCategory(title = stringResource(id = StringR.string.settings_rageshake)) { + PreferenceCategory(title = stringResource(id = CommonStrings.settings_rageshake)) { if (state.isSupported) { PreferenceSwitch( - title = stringResource(id = StringR.string.preference_rageshake), + title = stringResource(id = CommonStrings.preference_rageshake), isChecked = state.isEnabled, onCheckedChange = ::onEnabledChanged ) PreferenceSlide( - title = stringResource(id = StringR.string.settings_rageshake_detection_threshold), - // summary = stringResource(id = StringR.string.settings_rageshake_detection_threshold_summary), + title = stringResource(id = CommonStrings.settings_rageshake_detection_threshold), + // summary = stringResource(id = CommonStrings.settings_rageshake_detection_threshold_summary), value = state.sensitivity, enabled = state.isEnabled, steps = 3 /* 5 possible values - steps are in ]0, 1[ */, diff --git a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt index 0e0ebaaab2..60c36e0a29 100644 --- a/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt +++ b/features/rageshake/impl/src/main/kotlin/io/element/android/features/rageshake/impl/bugreport/BugReportView.kt @@ -58,7 +58,7 @@ import io.element.android.libraries.designsystem.theme.components.CircularProgre import io.element.android.libraries.designsystem.theme.components.OutlinedTextField import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.utils.LogCompositions -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun BugReportView( @@ -90,7 +90,7 @@ fun BugReportView( val isFormEnabled = state.sending !is Async.Loading // Title Text( - text = stringResource(id = StringR.string.action_report_bug), + text = stringResource(id = CommonStrings.action_report_bug), modifier = Modifier .fillMaxWidth() .padding(horizontal = 16.dp, vertical = 16.dp), @@ -190,7 +190,7 @@ fun BugReportView( .fillMaxWidth() .padding(vertical = 32.dp) ) { - Text(text = stringResource(id = StringR.string.action_send)) + Text(text = stringResource(id = CommonStrings.action_send)) } } when (state.sending) { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt index 6c8509f0a3..dcf39df326 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsView.kt @@ -77,7 +77,7 @@ import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.matrix.api.room.RoomMember -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalLayoutApi::class) @Composable @@ -198,7 +198,7 @@ internal fun RoomDetailsTopBar( onDismissRequest = { showMenu = false }, ) { DropdownMenuItem( - text = { Text(stringResource(id = StringR.string.action_edit)) }, + text = { Text(stringResource(id = CommonStrings.action_edit)) }, onClick = { // Explicitly close the menu before handling the action, as otherwise it stays open during the // transition and renders really badly. @@ -250,7 +250,7 @@ internal fun TopicSection( onActionClicked: (RoomDetailsAction) -> Unit, modifier: Modifier = Modifier ) { - PreferenceCategory(title = stringResource(StringR.string.common_topic), modifier = modifier) { + PreferenceCategory(title = stringResource(CommonStrings.common_topic), modifier = modifier) { if (roomTopic is RoomTopicState.CanAddTopic) { PreferenceText( title = stringResource(R.string.screen_room_details_add_topic_title), diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt index f7c2889505..f266b1dfef 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditView.kt @@ -76,8 +76,8 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton import io.element.android.libraries.matrix.ui.components.AvatarActionBottomSheet import io.element.android.libraries.matrix.ui.components.UnsavedAvatar +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.launch -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) @Composable @@ -121,7 +121,7 @@ fun RoomDetailsEditView( }, ) { Text( - text = stringResource(StringR.string.action_save), + text = stringResource(CommonStrings.action_save), fontSize = 16.sp, ) } @@ -145,7 +145,7 @@ fun RoomDetailsEditView( LabelledTextField( label = stringResource(id = R.string.screen_room_details_room_name_label), value = state.roomName, - placeholder = stringResource(StringR.string.common_room_name_placeholder), + placeholder = stringResource(CommonStrings.common_room_name_placeholder), singleLine = true, onValueChange = { state.eventSink(RoomDetailsEditEvents.UpdateRoomName(it)) }, ) @@ -160,9 +160,9 @@ fun RoomDetailsEditView( if (state.canChangeTopic) { LabelledTextField( - label = stringResource(StringR.string.common_topic), + label = stringResource(CommonStrings.common_topic), value = state.roomTopic, - placeholder = stringResource(StringR.string.common_topic_placeholder), + placeholder = stringResource(CommonStrings.common_topic_placeholder), maxLines = 10, onValueChange = { state.eventSink(RoomDetailsEditEvents.UpdateRoomTopic(it)) }, ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt index 22e91ce5a7..8b318e7ead 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt @@ -28,11 +28,11 @@ import io.element.android.anvilannotations.ContributesNode import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.room.MatrixRoom +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.apperror.api.AppErrorStateService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.launch -import io.element.android.libraries.ui.strings.R as StringR @ContributesNode(RoomScope::class) class RoomInviteMembersNode @AssistedInject constructor( @@ -65,8 +65,8 @@ class RoomInviteMembersNode @AssistedInject constructor( if (anyInviteFailed) { appErrorStateService.showError( - title = context.getString(StringR.string.common_unable_to_invite_title), - body = context.getString(StringR.string.common_unable_to_invite_message), + title = context.getString(CommonStrings.common_unable_to_invite_title), + body = context.getString(CommonStrings.common_unable_to_invite_message), ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt index 867d2f433d..5c07351db5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersView.kt @@ -52,8 +52,8 @@ import io.element.android.libraries.matrix.ui.components.CheckableUserRow import io.element.android.libraries.matrix.ui.components.SelectedUsersList import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalLayoutApi::class) @Composable @@ -131,7 +131,7 @@ fun RoomInviteMembersTopBar( TextButton( onClick = onSendPressed, content = { - Text(stringResource(StringR.string.action_send)) + Text(stringResource(CommonStrings.action_send)) }, enabled = canSend, ) @@ -147,7 +147,7 @@ private fun RoomInviteMembersSearchBar( selectedUsers: ImmutableList, active: Boolean, modifier: Modifier = Modifier, - placeHolderTitle: String = stringResource(StringR.string.common_search_for_someone), + placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), onActiveChanged: (Boolean) -> Unit = {}, onTextChanged: (String) -> Unit = {}, onUserToggled: (MatrixUser) -> Unit = {}, diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt index 7e87062481..5e181ec1c3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt @@ -61,8 +61,8 @@ import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.MatrixUserRow +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList -import io.element.android.libraries.ui.strings.R as StringR @OptIn(ExperimentalLayoutApi::class) @Composable @@ -100,7 +100,7 @@ fun RoomMemberListView( query = state.searchQuery, state = state.searchResults, active = state.isSearchActive, - placeHolderTitle = stringResource(StringR.string.common_search_for_someone), + placeHolderTitle = stringResource(CommonStrings.common_search_for_someone), onActiveChanged = { state.eventSink(RoomMemberListEvents.OnSearchActiveChanged(it)) }, onTextChanged = { state.eventSink(RoomMemberListEvents.UpdateSearchQuery(it)) }, onUserSelected = ::onUserSelected, @@ -221,7 +221,7 @@ private fun RoomMemberListTopBar( onClick = onInvitePressed, ) { Text( - text = stringResource(StringR.string.action_invite), + text = stringResource(CommonStrings.action_invite), fontSize = 16.sp, ) } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsView.kt index f995cb14b6..b9879be1cf 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsView.kt @@ -57,7 +57,7 @@ import io.element.android.libraries.designsystem.preview.LargeHeightPreview import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TopAppBar -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -129,7 +129,7 @@ internal fun RoomMemberHeaderSection( @Composable internal fun RoomMemberMainActionsSection(onShareUser: () -> Unit, modifier: Modifier = Modifier) { Row(modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { - MainActionButton(title = stringResource(StringR.string.action_share), icon = Icons.Outlined.Share, onClick = onShareUser) + MainActionButton(title = stringResource(CommonStrings.action_share), icon = Icons.Outlined.Share, onClick = onShareUser) } } @@ -137,7 +137,7 @@ internal fun RoomMemberMainActionsSection(onShareUser: () -> Unit, modifier: Mod internal fun SendMessageSection(onSendMessage: () -> Unit, modifier: Modifier = Modifier) { PreferenceCategory(modifier = modifier) { PreferenceText( - title = stringResource(StringR.string.action_send_message), + title = stringResource(CommonStrings.action_send_message), icon = Icons.Outlined.ChatBubbleOutline, onClick = onSendMessage, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt index 4e172bbbfe..fb71a241ce 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListContextMenu.kt @@ -41,7 +41,7 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.ModalBottomSheet import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -86,13 +86,13 @@ private fun RoomListModalBottomSheetContent( ) ListItem( headlineContent = { - Text(text = stringResource(id = StringR.string.common_settings)) + Text(text = stringResource(id = CommonStrings.common_settings)) }, modifier = Modifier.clickable { onRoomSettingsClicked(contextMenu.roomId) }, leadingContent = { Icon( imageVector = Icons.Outlined.Settings, - contentDescription = stringResource(id = StringR.string.common_settings), + contentDescription = stringResource(id = CommonStrings.common_settings), modifier = Modifier.size(20.dp), tint = MaterialTheme.colorScheme.onSurface, ) @@ -101,7 +101,7 @@ private fun RoomListModalBottomSheetContent( ListItem( headlineContent = { Text( - text = stringResource(id = StringR.string.action_leave_room), + text = stringResource(id = CommonStrings.action_leave_room), color = ElementTheme.colors.textActionCritical, ) }, @@ -109,7 +109,7 @@ private fun RoomListModalBottomSheetContent( leadingContent = { Icon( resourceId = VectorIcons.DoorOpen, - contentDescription = stringResource(id = StringR.string.action_leave_room), + contentDescription = stringResource(id = CommonStrings.action_leave_room), modifier = Modifier.size(20.dp), tint = ElementTheme.colors.textActionCritical, ) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index c5598b5426..32b09a288d 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -25,16 +25,16 @@ import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf -import io.element.android.libraries.ui.strings.R as StringR open class RoomListStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aRoomListState(), aRoomListState().copy(displayVerificationPrompt = true), - aRoomListState().copy(snackbarMessage = SnackbarMessage(StringR.string.common_verification_complete)), + aRoomListState().copy(snackbarMessage = SnackbarMessage(CommonStrings.common_verification_complete)), aRoomListState().copy(hasNetworkConnection = false), aRoomListState().copy(invitesState = InvitesState.SeenInvites), aRoomListState().copy(invitesState = InvitesState.NewInvites), diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt index b2f5e0f933..849378518d 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListView.kt @@ -83,8 +83,8 @@ import io.element.android.libraries.designsystem.theme.roomListUnreadIndicator import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.designsystem.utils.rememberSnackbarHostState import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.designsystem.R as DrawableR -import io.element.android.libraries.ui.strings.R as StringR @Composable fun RoomListView( @@ -229,7 +229,7 @@ fun RoomListContent( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = stringResource(StringR.string.action_invites_list), + text = stringResource(CommonStrings.action_invites_list), fontSize = 14.sp, style = noFontPadding, ) @@ -314,7 +314,7 @@ internal fun RequestVerificationHeader( Icon( modifier = Modifier.clickable(onClick = onDismissClicked), imageVector = Icons.Default.Close, - contentDescription = stringResource(StringR.string.action_close) + contentDescription = stringResource(CommonStrings.action_close) ) } Spacer(modifier = Modifier.height(4.dp)) @@ -325,7 +325,7 @@ internal fun RequestVerificationHeader( contentPadding = PaddingValues(horizontal = 20.dp, vertical = 7.dp), onClick = onVerifyClicked, ) { - Text(stringResource(StringR.string.action_continue), style = ElementTextStyles.Button) + Text(stringResource(CommonStrings.action_continue), style = ElementTextStyles.Button) } } } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt index f7fee35c75..10b02084b9 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt @@ -48,7 +48,7 @@ import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -109,7 +109,7 @@ private fun DefaultRoomListTopBar( onClick = onOpenSettings ) { val avatarData by remember { derivedStateOf { matrixUser.getAvatarData() } } - Avatar(avatarData, contentDescription = stringResource(StringR.string.common_settings)) + Avatar(avatarData, contentDescription = stringResource(CommonStrings.common_settings)) } } }, @@ -117,7 +117,7 @@ private fun DefaultRoomListTopBar( IconButton( onClick = onSearchClicked, ) { - Icon(Icons.Default.Search, contentDescription = stringResource(StringR.string.action_search)) + Icon(Icons.Default.Search, contentDescription = stringResource(CommonStrings.action_search)) } }, scrollBehavior = scrollBehavior, diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionView.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionView.kt index 2173c74897..31964e1f6f 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionView.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionView.kt @@ -51,8 +51,8 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.verification.VerificationEmoji +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.features.verifysession.impl.VerifySelfSessionState.VerificationStep as FlowStep -import io.element.android.libraries.ui.strings.R as StringR @Composable fun VerifySelfSessionView( @@ -190,8 +190,8 @@ internal fun BottomMenu(screenState: VerifySelfSessionState, goBack: () -> Unit) else -> null } val negativeButtonTitle = when (verificationViewState) { - FlowStep.Initial -> StringR.string.action_cancel - FlowStep.Canceled -> StringR.string.action_cancel + FlowStep.Initial -> CommonStrings.action_cancel + FlowStep.Canceled -> CommonStrings.action_cancel is FlowStep.Verifying -> R.string.screen_session_verification_they_dont_match else -> null } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncFailure.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncFailure.kt index e81bc140bf..b5aa9b85d3 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncFailure.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/async/AsyncFailure.kt @@ -31,7 +31,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun AsyncFailure( @@ -45,11 +45,11 @@ fun AsyncFailure( .padding(vertical = 32.dp), horizontalAlignment = Alignment.CenterHorizontally, ) { - Text(text = throwable.message ?: stringResource(id = StringR.string.error_unknown)) + Text(text = throwable.message ?: stringResource(id = CommonStrings.error_unknown)) if (onRetry != null) { Spacer(modifier = Modifier.height(24.dp)) Button(onClick = onRetry) { - Text(text = stringResource(id = StringR.string.action_retry)) + Text(text = stringResource(id = CommonStrings.action_retry)) } } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt index f959fa02a6..b16013775c 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/button/BackButton.kt @@ -28,14 +28,14 @@ import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconButton -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun BackButton( onClick: () -> Unit, modifier: Modifier = Modifier, imageVector: ImageVector = Icons.Default.ArrowBack, - contentDescription: String = stringResource(StringR.string.action_back), + contentDescription: String = stringResource(CommonStrings.action_back), enabled: Boolean = true, ) { IconButton( diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ConfirmationDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ConfirmationDialog.kt index 9d5ea55eb6..b11c9f878d 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ConfirmationDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ConfirmationDialog.kt @@ -31,7 +31,7 @@ import androidx.compose.ui.unit.Dp import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.utils.BooleanProvider -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -41,8 +41,8 @@ fun ConfirmationDialog( onDismiss: () -> Unit, modifier: Modifier = Modifier, title: String? = null, - submitText: String = stringResource(id = StringR.string.action_ok), - cancelText: String = stringResource(id = StringR.string.action_cancel), + submitText: String = stringResource(id = CommonStrings.action_ok), + cancelText: String = stringResource(id = CommonStrings.action_cancel), thirdButtonText: String? = null, emphasizeSubmitButton: Boolean = false, onCancelClicked: () -> Unit = onDismiss, diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialog.kt index 9a66e24425..d69281b6e9 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/ErrorDialog.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -91,8 +91,8 @@ private fun ErrorDialogContent( } object ErrorDialogDefaults { - val title: String @Composable get() = stringResource(id = StringR.string.dialog_title_error) - val submitText: String @Composable get() = stringResource(id = StringR.string.action_ok) + val title: String @Composable get() = stringResource(id = CommonStrings.dialog_title_error) + val submitText: String @Composable get() = stringResource(id = CommonStrings.action_ok) } @Preview(group = PreviewGroup.Dialogs) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/RetryDialog.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/RetryDialog.kt index 79e650fd37..731f688b82 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/RetryDialog.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/dialogs/RetryDialog.kt @@ -29,7 +29,7 @@ import androidx.compose.ui.unit.Dp import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun RetryDialog( @@ -109,9 +109,9 @@ private fun RetryDialogContent( } object RetryDialogDefaults { - val title: String @Composable get() = stringResource(id = StringR.string.dialog_title_error) - val retryText: String @Composable get() = stringResource(id = StringR.string.action_retry) - val dismissText: String @Composable get() = stringResource(id = StringR.string.action_cancel) + val title: String @Composable get() = stringResource(id = CommonStrings.dialog_title_error) + val retryText: String @Composable get() = stringResource(id = CommonStrings.action_retry) + val dismissText: String @Composable get() = stringResource(id = CommonStrings.action_cancel) } @Preview(group = PreviewGroup.Dialogs) diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt index 327c18cb34..1c76d46998 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatter.kt @@ -47,9 +47,9 @@ import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecry import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownMessageType import io.element.android.libraries.matrix.api.timeline.item.event.VideoMessageType +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.toolbox.api.strings.StringProvider import javax.inject.Inject -import io.element.android.libraries.ui.strings.R as StringR @ContributesBinding(SessionScope::class) class DefaultRoomLastMessageFormatter @Inject constructor( @@ -66,7 +66,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor( return when (val content = event.content) { is MessageContent -> processMessageContents(content, senderDisplayName, isDmRoom) RedactedContent -> { - val message = sp.getString(StringR.string.common_message_removed) + val message = sp.getString(CommonStrings.common_message_removed) if (!isDmRoom) { prefix(message, senderDisplayName) } else { @@ -77,7 +77,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor( content.body } is UnableToDecryptContent -> { - val message = sp.getString(StringR.string.common_decryption_error) + val message = sp.getString(CommonStrings.common_decryption_error) if (!isDmRoom) { prefix(message, senderDisplayName) } else { @@ -94,7 +94,7 @@ class DefaultRoomLastMessageFormatter @Inject constructor( stateContentFormatter.format(content, senderDisplayName, isOutgoing, RenderingMode.RoomList) } is FailedToParseMessageLikeContent, is FailedToParseStateContent, is UnknownContent -> { - prefixIfNeeded(sp.getString(StringR.string.common_unsupported_event), senderDisplayName, isDmRoom) + prefixIfNeeded(sp.getString(CommonStrings.common_unsupported_event), senderDisplayName, isDmRoom) } } } @@ -111,19 +111,19 @@ class DefaultRoomLastMessageFormatter @Inject constructor( messageType.body } is VideoMessageType -> { - sp.getString(StringR.string.common_video) + sp.getString(CommonStrings.common_video) } is ImageMessageType -> { - sp.getString(StringR.string.common_image) + sp.getString(CommonStrings.common_image) } is FileMessageType -> { - sp.getString(StringR.string.common_file) + sp.getString(CommonStrings.common_file) } is AudioMessageType -> { - sp.getString(StringR.string.common_audio) + sp.getString(CommonStrings.common_audio) } UnknownMessageType -> { - sp.getString(StringR.string.common_unsupported_event) + sp.getString(CommonStrings.common_unsupported_event) } is NoticeMessageType -> { messageType.body diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt index ccf9c2976a..678e0f1d53 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt @@ -19,10 +19,10 @@ package io.element.android.libraries.eventformatter.impl import io.element.android.libraries.eventformatter.impl.mode.RenderingMode import io.element.android.libraries.matrix.api.timeline.item.event.OtherState import io.element.android.libraries.matrix.api.timeline.item.event.StateContent +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.toolbox.api.strings.StringProvider import timber.log.Timber import javax.inject.Inject -import io.element.android.libraries.ui.strings.R as StringR class StateContentFormatter @Inject constructor( private val sp: StringProvider, @@ -50,7 +50,7 @@ class StateContentFormatter @Inject constructor( sp.getString(R.string.state_event_room_created, senderDisplayName) } } - is OtherState.RoomEncryption -> sp.getString(StringR.string.common_encryption_enabled) + is OtherState.RoomEncryption -> sp.getString(CommonStrings.common_encryption_enabled) is OtherState.RoomName -> { val hasRoomName = content.name != null when { diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt index da305ce212..1bd02c76f4 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt @@ -48,7 +48,7 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.room.RoomSummaryDetails import io.element.android.libraries.matrix.api.user.MatrixUser -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun SelectedRoom( @@ -84,7 +84,7 @@ fun SelectedRoom( ) { Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(id = StringR.string.action_remove), + contentDescription = stringResource(id = CommonStrings.action_remove), tint = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.padding(2.dp) ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt index a5d8b9a465..ed6dc7e95a 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedUser.kt @@ -47,7 +47,7 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun SelectedUser( @@ -83,7 +83,7 @@ fun SelectedUser( ) { Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(id = StringR.string.action_remove), + contentDescription = stringResource(id = CommonStrings.action_remove), tint = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.padding(2.dp) ) diff --git a/libraries/textcomposer/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt b/libraries/textcomposer/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt index 0256d7e529..afc0c30c55 100644 --- a/libraries/textcomposer/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt +++ b/libraries/textcomposer/src/main/kotlin/io/element/android/libraries/textcomposer/TextComposer.kt @@ -79,7 +79,7 @@ import io.element.android.libraries.matrix.api.media.MediaSource import io.element.android.libraries.matrix.ui.components.AttachmentThumbnail import io.element.android.libraries.matrix.ui.components.AttachmentThumbnailInfo import io.element.android.libraries.matrix.ui.components.AttachmentThumbnailType -import io.element.android.libraries.ui.strings.R as StringR +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -146,7 +146,7 @@ fun TextComposer( contentPadding = PaddingValues(top = 10.dp, bottom = 10.dp, start = 12.dp, end = 42.dp), interactionSource = remember { MutableInteractionSource() }, placeholder = { - Text(stringResource(StringR.string.common_message), style = defaultTypography) + Text(stringResource(CommonStrings.common_message), style = defaultTypography) }, colors = TextFieldDefaults.colors( unfocusedTextColor = MaterialTheme.colorScheme.secondary, @@ -225,7 +225,7 @@ private fun EditingModeView( ) Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(StringR.string.action_close), + contentDescription = stringResource(CommonStrings.action_close), tint = MaterialTheme.colorScheme.secondary, modifier = Modifier .size(16.dp) @@ -283,7 +283,7 @@ private fun ReplyToModeView( ) Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(StringR.string.action_close), + contentDescription = stringResource(CommonStrings.action_close), tint = MaterialTheme.colorScheme.secondary, modifier = Modifier .size(16.dp) @@ -367,8 +367,8 @@ private fun BoxScope.SendButton( else -> R.drawable.ic_send } val contentDescription = when (composerMode) { - is MessageComposerMode.Edit -> stringResource(StringR.string.action_edit) - else -> stringResource(StringR.string.action_send) + is MessageComposerMode.Edit -> stringResource(CommonStrings.action_edit) + else -> stringResource(CommonStrings.action_send) } Icon( modifier = Modifier.size(16.dp), From 287328f7dfcb6c35758021442cb06674a9d90368 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jun 2023 09:51:33 +0200 Subject: [PATCH 3/8] More cleanup --- .../android/appnav/LoggedInEventProcessor.kt | 6 +++--- .../createroom/impl/components/SearchUserBar.kt | 4 ++-- .../createroom/impl/root/CreateRoomRootNode.kt | 8 ++++---- .../features/leaveroom/api/LeaveRoomView.kt | 3 +-- .../location/api/internal/StaticMapPlaceholder.kt | 1 - .../android/features/messages/impl/MessagesView.kt | 4 ++-- .../attachments/preview/AttachmentsPreviewView.kt | 9 ++++----- .../attachments/preview/error/ErrorFormatter.kt | 6 +++--- .../components/TimelineEventTimestampView.kt | 4 ++-- .../messagesummary/MessageSummaryFormatterImpl.kt | 14 +++++++------- .../impl/developer/DeveloperSettingsView.kt | 4 ++-- .../roomlist/impl/search/RoomListSearch.kt | 4 ++-- .../designsystem/theme/components/SearchBar.kt | 8 ++++---- .../impl/DefaultTimelineEventFormatter.kt | 4 ++-- .../matrix/ui/components/UnresolvedUserRow.kt | 4 ++-- .../libraries/matrix/ui/media/AvatarAction.kt | 8 ++++---- 16 files changed, 44 insertions(+), 47 deletions(-) diff --git a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt index c07a2d72e9..3a8b243be6 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/LoggedInEventProcessor.kt @@ -21,7 +21,7 @@ import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.VerificationFlowState -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.drop @@ -48,13 +48,13 @@ class LoggedInEventProcessor @Inject constructor( fun observeEvents(coroutineScope: CoroutineScope) { observingJob = coroutineScope.launch { displayLeftRoomMessage.onEach { - displayMessage(R.string.common_current_user_left_room) + displayMessage(CommonStrings.common_current_user_left_room) }.launchIn(this) displayVerificationSuccessfulMessage .drop(1) .onEach { - displayMessage(R.string.common_verification_complete) + displayMessage(CommonStrings.common_verification_complete) }.launchIn(this) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt index 9729b53fae..fdcd8900b4 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/components/SearchUserBar.kt @@ -40,7 +40,7 @@ import io.element.android.libraries.designsystem.theme.components.SearchBar import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.SelectedUsersList -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.libraries.usersearch.api.UserSearchResult import kotlinx.collections.immutable.ImmutableList @@ -54,7 +54,7 @@ fun SearchUserBar( isMultiSelectionEnabled: Boolean, modifier: Modifier = Modifier, showBackButton: Boolean = true, - placeHolderTitle: String = stringResource(R.string.common_search_for_someone), + placeHolderTitle: String = stringResource(CommonStrings.common_search_for_someone), onActiveChanged: (Boolean) -> Unit = {}, onTextChanged: (String) -> Unit = {}, onUserSelected: (MatrixUser) -> Unit = {}, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt index 4089be0fa2..5a2dde7661 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootNode.kt @@ -35,7 +35,7 @@ import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.analytics.api.AnalyticsService import timber.log.Timber @@ -91,9 +91,9 @@ class CreateRoomRootNode @AssistedInject constructor( startSharePlainTextIntent( context = context, activityResultLauncher = null, - chooserTitle = context.getString(R.string.action_invite_friends), - text = context.getString(R.string.invite_friends_text, appName, permalink), - extraTitle = context.getString(R.string.invite_friends_rich_title, appName), + chooserTitle = context.getString(CommonStrings.action_invite_friends), + text = context.getString(CommonStrings.invite_friends_text, appName, permalink), + extraTitle = context.getString(CommonStrings.invite_friends_rich_title, appName), noActivityFoundMessage = context.getString(io.element.android.libraries.androidutils.R.string.error_no_compatible_app_found) ) }.onFailure { diff --git a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt index 9a3a86a94c..ffd751c699 100644 --- a/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt +++ b/features/leaveroom/api/src/main/kotlin/io/element/android/features/leaveroom/api/LeaveRoomView.kt @@ -31,7 +31,6 @@ import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.ui.strings.R import io.element.android.libraries.ui.strings.CommonStrings @Composable @@ -77,7 +76,7 @@ private fun LeaveRoomConfirmationDialog( ) { ConfirmationDialog( content = stringResource(text), - submitText = stringResource(R.string.action_leave), + submitText = stringResource(CommonStrings.action_leave), onSubmitClicked = { eventSink(LeaveRoomEvent.LeaveRoom(roomId)) }, onDismiss = { eventSink(LeaveRoomEvent.HideConfirmation) }, ) diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt index d39bfd7d15..3a6a6536c0 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt @@ -40,7 +40,6 @@ import io.element.android.libraries.designsystem.theme.components.CircularProgre import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.features.location.api.R -import io.element.android.libraries.ui.strings.R as StringsR @Composable internal fun StaticMapPlaceholder( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index 8e2558770d..898db2a829 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -77,9 +77,9 @@ import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.designsystem.utils.rememberSnackbarHostState import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.timeline.item.event.EventSendState +import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList import timber.log.Timber -import io.element.android.libraries.ui.strings.R as StringsR @OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) @Composable @@ -195,7 +195,7 @@ private fun AttachmentStateView( is AttachmentsState.Previewing -> LaunchedEffect(state) { onPreviewAttachments(state.attachments) } - is AttachmentsState.Sending -> ProgressDialog(text = stringResource(id = StringsR.string.common_loading)) + is AttachmentsState.Sending -> ProgressDialog(text = stringResource(id = CommonStrings.common_loading)) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt index 8eca2c3313..7388dd665b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewView.kt @@ -41,8 +41,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.theme.components.Scaffold import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.components.TextButton -import io.element.android.libraries.ui.strings.R -import io.element.android.libraries.ui.strings.R as StringsR +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun AttachmentsPreviewView( @@ -92,7 +91,7 @@ private fun AttachmentSendStateView( ) { when (sendActionState) { is Async.Loading -> { - ProgressDialog(text = stringResource(id = R.string.common_loading)) + ProgressDialog(text = stringResource(id = CommonStrings.common_loading)) } is Async.Failure -> { @@ -151,10 +150,10 @@ private fun AttachmentsPreviewBottomActions( modifier = modifier, ) { TextButton(onClick = onCancelClicked) { - Text(stringResource(id = StringsR.string.action_cancel)) + Text(stringResource(id = CommonStrings.action_cancel)) } TextButton(onClick = onSendClicked) { - Text(stringResource(id = StringsR.string.action_send)) + Text(stringResource(id = CommonStrings.action_send)) } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt index 92dcd21b8e..7ef86e4817 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/error/ErrorFormatter.kt @@ -17,14 +17,14 @@ package io.element.android.features.messages.impl.attachments.preview.error import io.element.android.libraries.mediaupload.api.MediaPreProcessor -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings fun sendAttachmentError( throwable: Throwable ): Int { return if (throwable is MediaPreProcessor.Failure) { - R.string.screen_media_upload_preview_error_failed_processing + CommonStrings.screen_media_upload_preview_error_failed_processing } else { - R.string.screen_media_upload_preview_error_failed_sending + CommonStrings.screen_media_upload_preview_error_failed_sending } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt index 530f62a188..15dde3d85b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineEventTimestampView.kt @@ -44,7 +44,7 @@ import io.element.android.libraries.designsystem.theme.ElementTheme import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.timeline.item.event.EventSendState -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineEventTimestampView( @@ -70,7 +70,7 @@ fun TimelineEventTimestampView( ) { if (isMessageEdited) { Text( - stringResource(R.string.common_edited_suffix), + stringResource(CommonStrings.common_edited_suffix), style = ElementTextStyles.Regular.caption2, color = tint ?: MaterialTheme.colorScheme.secondary, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/MessageSummaryFormatterImpl.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/MessageSummaryFormatterImpl.kt index b924a9e7b4..c7bae0c995 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/MessageSummaryFormatterImpl.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/utils/messagesummary/MessageSummaryFormatterImpl.kt @@ -30,7 +30,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt import io.element.android.features.messages.impl.timeline.model.event.TimelineItemVideoContent import io.element.android.libraries.di.ApplicationContext import io.element.android.libraries.di.RoomScope -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings import javax.inject.Inject @ContributesBinding(RoomScope::class) @@ -42,12 +42,12 @@ class MessageSummaryFormatterImpl @Inject constructor( is TimelineItemTextBasedContent -> event.content.body is TimelineItemStateContent -> event.content.body is TimelineItemProfileChangeContent -> event.content.body - is TimelineItemEncryptedContent -> context.getString(R.string.common_unable_to_decrypt) - is TimelineItemRedactedContent -> context.getString(R.string.common_message_removed) - is TimelineItemUnknownContent -> context.getString(R.string.common_unsupported_event) - is TimelineItemImageContent -> context.getString(R.string.common_image) - is TimelineItemVideoContent -> context.getString(R.string.common_video) - is TimelineItemFileContent -> context.getString(R.string.common_file) + is TimelineItemEncryptedContent -> context.getString(CommonStrings.common_unable_to_decrypt) + is TimelineItemRedactedContent -> context.getString(CommonStrings.common_message_removed) + is TimelineItemUnknownContent -> context.getString(CommonStrings.common_unsupported_event) + is TimelineItemImageContent -> context.getString(CommonStrings.common_image) + is TimelineItemVideoContent -> context.getString(CommonStrings.common_video) + is TimelineItemFileContent -> context.getString(CommonStrings.common_file) } } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt index 027b3cfd1d..adbe2ad7e3 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt @@ -32,7 +32,7 @@ import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.featureflag.ui.FeatureListView import io.element.android.libraries.featureflag.ui.model.FeatureUiModel -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun DeveloperSettingsView( @@ -44,7 +44,7 @@ fun DeveloperSettingsView( PreferenceView( modifier = modifier, onBackPressed = onBackPressed, - title = stringResource(id = R.string.common_developer_options) + title = stringResource(id = CommonStrings.common_developer_options) ) { // Note: this is OK to hardcode strings in this debug screen. PreferenceCategory(title = "Feature flags") { diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearch.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearch.kt index f70c46c18b..f277fe80be 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearch.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/search/RoomListSearch.kt @@ -64,7 +64,7 @@ import io.element.android.libraries.designsystem.theme.components.TextField import io.element.android.libraries.designsystem.theme.components.TopAppBar import io.element.android.libraries.designsystem.utils.copy import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun RoomListSearchResultView( @@ -150,7 +150,7 @@ internal fun RoomListSearchResultContent( }) { Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.action_cancel) + contentDescription = stringResource(CommonStrings.action_cancel) ) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchBar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchBar.kt index 76b4ebae16..3fd572232a 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchBar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/theme/components/SearchBar.kt @@ -47,7 +47,7 @@ import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.PreviewGroup import io.element.android.libraries.designsystem.theme.LocalColors -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -100,7 +100,7 @@ fun SearchBar( IconButton(onClick = { onQueryChange("") }) { Icon( imageVector = Icons.Default.Close, - contentDescription = stringResource(R.string.action_clear), + contentDescription = stringResource(CommonStrings.action_clear), ) } } @@ -110,7 +110,7 @@ fun SearchBar( { Icon( imageVector = Icons.Default.Search, - contentDescription = stringResource(R.string.action_search), + contentDescription = stringResource(CommonStrings.action_search), tint = MaterialTheme.colorScheme.tertiary, ) } @@ -135,7 +135,7 @@ fun SearchBar( Spacer(Modifier.size(80.dp)) Text( - text = stringResource(R.string.common_no_results), + text = stringResource(CommonStrings.common_no_results), textAlign = TextAlign.Center, color = MaterialTheme.colorScheme.tertiary, modifier = Modifier.fillMaxWidth() diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt index 4bcae94c1e..945df3df7a 100644 --- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt +++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/DefaultTimelineEventFormatter.kt @@ -34,7 +34,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.StateContent import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.toolbox.api.strings.StringProvider import javax.inject.Inject @@ -71,7 +71,7 @@ class DefaultTimelineEventFormatter @Inject constructor( if (buildMeta.isDebuggable) { error("You should not use this formatter for this event: $event") } - sp.getString(R.string.common_unsupported_event) + sp.getString(CommonStrings.common_unsupported_event) } } } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt index 617b0f944d..809636679d 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UnresolvedUserRow.kt @@ -48,7 +48,7 @@ import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.theme.noFontPadding import io.element.android.libraries.matrix.ui.model.getAvatarData -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @Composable fun UnresolvedUserRow( @@ -94,7 +94,7 @@ fun UnresolvedUserRow( ) Text( - text = stringResource(R.string.common_invite_unknown_profile), + text = stringResource(CommonStrings.common_invite_unknown_profile), color = MaterialTheme.colorScheme.secondary, fontSize = 12.sp, lineHeight = 16.sp, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarAction.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarAction.kt index 624eb7c607..0a178f2c25 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarAction.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/media/AvatarAction.kt @@ -23,7 +23,7 @@ import androidx.compose.material.icons.outlined.PhotoCamera import androidx.compose.material.icons.outlined.PhotoLibrary import androidx.compose.runtime.Immutable import androidx.compose.ui.graphics.vector.ImageVector -import io.element.android.libraries.ui.strings.R +import io.element.android.libraries.ui.strings.CommonStrings @Immutable sealed class AvatarAction( @@ -31,7 +31,7 @@ sealed class AvatarAction( val icon: ImageVector, val destructive: Boolean = false, ) { - object TakePhoto : AvatarAction(titleResId = R.string.action_take_photo, icon = Icons.Outlined.PhotoCamera) - object ChoosePhoto : AvatarAction(titleResId = R.string.action_choose_photo, icon = Icons.Outlined.PhotoLibrary) - object Remove : AvatarAction(titleResId = R.string.action_remove, icon = Icons.Outlined.Delete, destructive = true) + object TakePhoto : AvatarAction(titleResId = CommonStrings.action_take_photo, icon = Icons.Outlined.PhotoCamera) + object ChoosePhoto : AvatarAction(titleResId = CommonStrings.action_choose_photo, icon = Icons.Outlined.PhotoLibrary) + object Remove : AvatarAction(titleResId = CommonStrings.action_remove, icon = Icons.Outlined.Delete, destructive = true) } From 1a216d5a5729bb345f88e1015a80c438ddcf28b0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jun 2023 09:55:14 +0200 Subject: [PATCH 4/8] Update check rule. --- tools/check/forbidden_strings_in_code.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt index 41a6c16466..6c91c0baf7 100755 --- a/tools/check/forbidden_strings_in_code.txt +++ b/tools/check/forbidden_strings_in_code.txt @@ -130,5 +130,5 @@ System\.currentTimeMillis\(\)===1 ### Suspicious String template. Please check that the string template will behave as expected, i.e. the class field and not the whole object will be used. For instance `Timber.d("$event.type")` is not correct, you should write `Timber.d("${event.type}")`. In the former the whole event content will be logged, since it's a data class. If this is expected (i.e. to fix false positive), please add explicit curly braces (`{` and `}`) around the variable, for instance `"elementLogs.${i}.txt"` \$[a-zA-Z_]\w*\??\.[a-zA-Z_] -### Use `import io.element.android.libraries.ui.strings.R as StringsR` then `StringR.string.` instead -io\.element\.android\.libraries\.ui\.strings\.R\. +### Use `import io.element.android.libraries.ui.strings.CommonStrings` then `CommonStrings.` instead +import io\.element\.android\.libraries\.ui\.strings\.R From 6eb02e8c97eb287c641686afafcf4ebda34dc068 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 27 Jun 2023 11:29:45 +0200 Subject: [PATCH 5/8] Fix compilation issue. --- .../features/location/api/internal/StaticMapPlaceholder.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt index 3a6a6536c0..fa75613081 100644 --- a/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt +++ b/features/location/api/src/main/kotlin/io/element/android/features/location/api/internal/StaticMapPlaceholder.kt @@ -40,6 +40,7 @@ import io.element.android.libraries.designsystem.theme.components.CircularProgre import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.features.location.api.R +import io.element.android.libraries.ui.strings.CommonStrings @Composable internal fun StaticMapPlaceholder( @@ -75,7 +76,7 @@ internal fun StaticMapPlaceholder( imageVector = Icons.Default.Refresh, contentDescription = null ) - Text(text = stringResource(id = StringsR.string.action_static_map_load)) + Text(text = stringResource(id = CommonStrings.action_static_map_load)) } } } From 2a82e1b4e465b67cfac3d57528ed7877804191a3 Mon Sep 17 00:00:00 2001 From: Marco Romano Date: Tue, 27 Jun 2023 13:37:23 +0200 Subject: [PATCH 6/8] Async API improvements "v2" (#672) * Async API improvements "v2" **NB: This PR actually changes only 3 files in `libraries/architecture/`. All the other changes are automated refactors to fix the calling code.** This is a proposal for improvements to our `Async` type as discussed in: https://github.com/vector-im/element-x-android/pull/598/files#r1230664392 and in other chats. Please bear in mind it is just a proposal, I'd love to hear your feedback about it, especially when it comes to naming: I've tried to make parameter and function names use a terminology similar to what we find in the Kotlin stdlib and its `Result` type. I'm inclined to like more the non-extension flavours of the new `run*` APIs, though I'd also like your feedback about what API shape you prefer. ### Summary of the changes: #### Functional - Adds `exceptionOrNull()` API to complement the existing `dataOrNull()` API. - Adds `isFailure()`, `isLoading()`, `isSuccess()` and `isUninitialized()` courtesy APIs. - Renames `executeResult()` to `runUpdatingState()`: - Becomes the base API to which all the other similarly named APIs call into. - Makes it inline. - Adds contract. - Passes over any `prevData` to newre Async states. - Passes through the `block`s return value. - Adds unit tests. - Renames `execute` to `runCatchingUpdatingState()` and makes it just call into `runUpdatingState()` - Adds extension function overloads to the `run*` functions to accept `MutableState` as receiver #### Cosmetics - Reorders classes and methods in alphabetic order. - Reorder parameter names to mimic conventions in Kotlin stdlib. - Adds docstrings where useful. * Use `fold()` * rename pop to popFirst * Add docstrings * Please Detekt * Rename exception to error. * Please detekt * Update existing usages. --- .../configureroom/ConfigureRoomPresenter.kt | 4 +- .../impl/configureroom/ConfigureRoomView.kt | 2 +- .../impl/root/CreateRoomRootPresenter.kt | 4 +- .../impl/root/CreateRoomRootView.kt | 2 +- .../invitelist/impl/InviteListPresenter.kt | 6 +- .../invitelist/impl/InviteListView.kt | 2 +- .../changeserver/ChangeServerPresenter.kt | 4 +- .../ConfirmAccountProviderPresenter.kt | 4 +- .../ConfirmAccountProviderView.kt | 2 +- .../SearchAccountProviderView.kt | 2 +- .../impl/DefaultLogoutPreferencePresenter.kt | 4 +- .../preview/AttachmentsPreviewPresenter.kt | 6 +- .../impl/forward/ForwardMessagesPresenter.kt | 2 - .../impl/media/viewer/MediaViewerPresenter.kt | 6 +- .../impl/media/viewer/MediaViewerView.kt | 1 - .../impl/report/ReportMessagePresenter.kt | 7 +- .../developer/DeveloperSettingsPresenter.kt | 6 +- .../impl/developer/DeveloperSettingsView.kt | 2 - .../impl/edit/RoomDetailsEditPresenter.kt | 4 +- .../impl/invite/RoomInviteMembersPresenter.kt | 4 +- .../impl/members/RoomMemberListView.kt | 3 +- .../members/RoomMemberListPresenterTests.kt | 4 +- libraries/architecture/build.gradle.kts | 4 + .../android/libraries/architecture/Async.kt | 163 ++++++++++++++---- .../libraries/architecture/AsyncKtTest.kt | 113 ++++++++++++ 25 files changed, 286 insertions(+), 75 deletions(-) create mode 100644 libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index 8143114573..21d8f8d13f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -30,7 +30,7 @@ import io.element.android.features.createroom.impl.CreateRoomConfig import io.element.android.features.createroom.impl.CreateRoomDataStore import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -131,7 +131,7 @@ class ConfigureRoomPresenter @Inject constructor( dataStore.clearCachedData() analyticsService.capture(CreatedRoom(isDM = false)) } - }.execute(createRoomAction) + }.runCatchingUpdatingState(createRoomAction) } private suspend fun uploadAvatar(avatarUri: Uri): String { diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt index 703fa268e2..c66dbc1e59 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt @@ -84,7 +84,7 @@ fun ConfigureRoomView( if (state.createRoomAction is Async.Success) { LaunchedEffect(state.createRoomAction) { - onRoomCreated(state.createRoomAction.state) + onRoomCreated(state.createRoomAction.data) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index 70f006f643..67bf22d22a 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -28,7 +28,7 @@ import io.element.android.features.createroom.impl.userlist.UserListPresenter import io.element.android.features.createroom.impl.userlist.UserListPresenterArgs import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.meta.BuildMeta import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -95,6 +95,6 @@ class CreateRoomRootPresenter @Inject constructor( suspend { matrixClient.createDM(user.userId).getOrThrow() .also { analyticsService.capture(CreatedRoom(isDM = true)) } - }.execute(startDmAction) + }.runCatchingUpdatingState(startDmAction) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt index 1265243c50..c83c0e620b 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootView.kt @@ -69,7 +69,7 @@ fun CreateRoomRootView( ) { if (state.startDmAction is Async.Success) { LaunchedEffect(state.startDmAction) { - onOpenDM(state.startDmAction.state) + onOpenDM(state.startDmAction.data) } } diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt index db9fec3153..d537517d54 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt @@ -30,7 +30,7 @@ import io.element.android.features.invitelist.impl.model.InviteListInviteSummary import io.element.android.features.invitelist.impl.model.InviteSender import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId @@ -135,7 +135,7 @@ class InviteListPresenter @Inject constructor( it.acceptInvitation().getOrThrow() } roomId - }.execute(acceptedAction) + }.runCatchingUpdatingState(acceptedAction) } private fun CoroutineScope.declineInvite(roomId: RoomId, declinedAction: MutableState>) = launch { @@ -143,7 +143,7 @@ class InviteListPresenter @Inject constructor( client.getRoom(roomId)?.use { it.rejectInvitation().getOrThrow() } ?: Unit - }.execute(declinedAction) + }.runCatchingUpdatingState(declinedAction) } private fun RoomSummary.Filled.toInviteSummary(seen: Boolean) = details.run { diff --git a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt index 5ef0402055..70e4041c35 100644 --- a/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt +++ b/features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListView.kt @@ -58,7 +58,7 @@ fun InviteListView( ) { if (state.acceptedAction is Async.Success) { LaunchedEffect(state.acceptedAction) { - onInviteAccepted(state.acceptedAction.state) + onInviteAccepted(state.acceptedAction.data) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt index 2e3f9548d6..ef9f9e2441 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/changeserver/ChangeServerPresenter.kt @@ -26,7 +26,7 @@ import io.element.android.features.login.impl.accountprovider.AccountProviderDat import io.element.android.features.login.impl.error.ChangeServerError import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import kotlinx.coroutines.CoroutineScope @@ -71,6 +71,6 @@ class ChangeServerPresenter @Inject constructor( // Valid, remember user choice accountProviderDataSource.userSelection(data) }.getOrThrow() - }.execute(changeServerAction, errorMapping = ChangeServerError::from) + }.runCatchingUpdatingState(changeServerAction, errorTransform = ChangeServerError::from) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt index 2626e56365..123d3013c7 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt @@ -30,7 +30,7 @@ import io.element.android.features.login.impl.accountprovider.AccountProviderDat import io.element.android.features.login.impl.error.ChangeServerError import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService import kotlinx.coroutines.CoroutineScope @@ -95,6 +95,6 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor( throw IllegalStateException("Unsupported login flow") } }.getOrThrow() - }.execute(loginFlowAction, errorMapping = ChangeServerError::from) + }.runCatchingUpdatingState(loginFlowAction, errorTransform = ChangeServerError::from) } } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderView.kt index e6e1ce8e83..3efa0be668 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderView.kt @@ -131,7 +131,7 @@ fun ConfirmAccountProviderView( } is Async.Loading -> Unit // The Continue button shows the loading state is Async.Success -> { - when (val loginFlowState = state.loginFlow.state) { + when (val loginFlowState = state.loginFlow.data) { is LoginFlow.OidcFlow -> onOidcDetails(loginFlowState.oidcDetails) LoginFlow.PasswordLogin -> onLoginPasswordNeeded() } diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt index 5c280cba0e..3f63f36134 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/searchaccountprovider/SearchAccountProviderView.kt @@ -171,7 +171,7 @@ fun SearchAccountProviderView( } } is Async.Success -> { - items(state.userInputResult.state) { homeserverData -> + items(state.userInputResult.data) { homeserverData -> val item = homeserverData.toAccountProvider() AccountProviderView( item = item, diff --git a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutPreferencePresenter.kt b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutPreferencePresenter.kt index baad764025..e957755b98 100644 --- a/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutPreferencePresenter.kt +++ b/features/logout/impl/src/main/kotlin/io/element/android/features/logout/impl/DefaultLogoutPreferencePresenter.kt @@ -26,7 +26,7 @@ import io.element.android.features.logout.api.LogoutPreferenceEvents import io.element.android.features.logout.api.LogoutPreferencePresenter import io.element.android.features.logout.api.LogoutPreferenceState import io.element.android.libraries.architecture.Async -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.MatrixClient import kotlinx.coroutines.CoroutineScope @@ -59,6 +59,6 @@ class DefaultLogoutPreferencePresenter @Inject constructor(private val matrixCli private fun CoroutineScope.logout(logoutAction: MutableState>) = launch { suspend { matrixClient.logout() - }.execute(logoutAction) + }.runCatchingUpdatingState(logoutAction) } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt index 807a23f6cc..9761a939b3 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/attachments/preview/AttachmentsPreviewPresenter.kt @@ -27,7 +27,7 @@ import dagger.assisted.AssistedInject import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.executeResult +import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.mediaupload.api.MediaSender import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -83,8 +83,8 @@ class AttachmentsPreviewPresenter @AssistedInject constructor( mediaAttachment: Attachment.Media, sendActionState: MutableState>, ) { - suspend { + sendActionState.runUpdatingState { mediaSender.sendMedia(mediaAttachment.localMedia.uri, mediaAttachment.localMedia.info.mimeType, mediaAttachment.compressIfPossible) - }.executeResult(sendActionState) + } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt index 17494f892e..38ab84367a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/forward/ForwardMessagesPresenter.kt @@ -24,14 +24,12 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.isLoading import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.EventId diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt index 5ef1bdcd47..d0c0abfbca 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerPresenter.kt @@ -117,7 +117,7 @@ class MediaViewerPresenter @AssistedInject constructor( private fun CoroutineScope.saveOnDisk(localMedia: Async) = launch { if (localMedia is Async.Success) { - localMediaActions.saveOnDisk(localMedia.state) + localMediaActions.saveOnDisk(localMedia.data) .onSuccess { val snackbarMessage = SnackbarMessage(StringR.string.common_file_saved_on_disk_android) snackbarDispatcher.post(snackbarMessage) @@ -131,7 +131,7 @@ class MediaViewerPresenter @AssistedInject constructor( private fun CoroutineScope.share(localMedia: Async) = launch { if (localMedia is Async.Success) { - localMediaActions.share(localMedia.state) + localMediaActions.share(localMedia.data) .onFailure { val snackbarMessage = SnackbarMessage(mediaActionsError(it)) snackbarDispatcher.post(snackbarMessage) @@ -141,7 +141,7 @@ class MediaViewerPresenter @AssistedInject constructor( private fun CoroutineScope.open(localMedia: Async) = launch { if (localMedia is Async.Success) { - localMediaActions.open(localMedia.state) + localMediaActions.open(localMedia.data) .onFailure { val snackbarMessage = SnackbarMessage(mediaActionsError(it)) snackbarDispatcher.post(snackbarMessage) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt index 9cc1ed69fd..1f540f4c38 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/media/viewer/MediaViewerView.kt @@ -57,7 +57,6 @@ import io.element.android.features.messages.impl.media.local.LocalMediaView import io.element.android.features.messages.impl.media.local.MediaInfo import io.element.android.features.messages.impl.media.local.rememberLocalMediaViewState import io.element.android.libraries.architecture.Async -import io.element.android.libraries.architecture.isLoading import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.components.dialogs.RetryDialog diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt index 09cad8e33b..c8476a9b64 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessagePresenter.kt @@ -29,8 +29,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.executeResult -import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.architecture.runUpdatingState import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.matrix.api.core.EventId @@ -87,12 +86,12 @@ class ReportMessagePresenter @AssistedInject constructor( blockUser: Boolean, result: MutableState>, ) = launch { - suspend { + result.runUpdatingState { val userIdToBlock = userId.takeIf { blockUser } room.reportContent(eventId, reason, userIdToBlock) .onSuccess { snackbarDispatcher.post(SnackbarMessage(StringR.string.common_report_submitted)) } - }.executeResult(result) + } } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt index d4430dd2e3..2e10622c7a 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsPresenter.kt @@ -29,7 +29,7 @@ import io.element.android.features.preferences.impl.tasks.ClearCacheUseCase import io.element.android.features.preferences.impl.tasks.ComputeCacheSizeUseCase import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.bool.orFalse import io.element.android.libraries.featureflag.api.Feature import io.element.android.libraries.featureflag.api.FeatureFlagService @@ -128,13 +128,13 @@ class DeveloperSettingsPresenter @Inject constructor( private fun CoroutineScope.computeCacheSize(cacheSize: MutableState>) = launch { suspend { computeCacheSizeUseCase() - }.execute(cacheSize) + }.runCatchingUpdatingState(cacheSize) } private fun CoroutineScope.clearCache(clearCacheAction: MutableState>) = launch { suspend { clearCacheUseCase() - }.execute(clearCacheAction) + }.runCatchingUpdatingState(clearCacheAction) } } diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt index 027b3cfd1d..3c1bd1f9ba 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/developer/DeveloperSettingsView.kt @@ -23,8 +23,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter -import io.element.android.libraries.architecture.Async -import io.element.android.libraries.architecture.isLoading import io.element.android.libraries.designsystem.components.preferences.PreferenceCategory import io.element.android.libraries.designsystem.components.preferences.PreferenceText import io.element.android.libraries.designsystem.components.preferences.PreferenceView diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt index 615541a3de..d4d6643038 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditPresenter.kt @@ -31,7 +31,7 @@ import androidx.compose.runtime.setValue import androidx.core.net.toUri import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.StateEventType @@ -154,7 +154,7 @@ class RoomDetailsEditPresenter @Inject constructor( }) } if (results.all { it.isSuccess }) Unit else results.first { it.isFailure }.getOrThrow() - }.execute(action) + }.runCatchingUpdatingState(action) } private suspend fun updateAvatar(avatarUri: Uri?): Result { diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt index ef882c2f40..00cb04b118 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersPresenter.kt @@ -27,7 +27,7 @@ import androidx.compose.runtime.setValue import io.element.android.features.roomdetails.impl.members.RoomMemberListDataSource import io.element.android.libraries.architecture.Async import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.architecture.execute +import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.SearchBarResultState import io.element.android.libraries.matrix.api.room.RoomMember @@ -147,7 +147,7 @@ class RoomInviteMembersPresenter @Inject constructor( withContext(coroutineDispatchers.io) { roomMemberListDataSource.search("").toImmutableList() } - }.execute(roomMembers) + }.runCatchingUpdatingState(roomMembers) } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt index 7e87062481..41805bdb77 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListView.kt @@ -44,7 +44,6 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.element.android.features.roomdetails.impl.R import io.element.android.libraries.architecture.Async -import io.element.android.libraries.architecture.isLoading import io.element.android.libraries.designsystem.ElementTextStyles import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.button.BackButton @@ -110,7 +109,7 @@ fun RoomMemberListView( if (!state.isSearchActive) { if (state.roomMembers is Async.Success) { RoomMemberList( - roomMembers = state.roomMembers.state, + roomMembers = state.roomMembers.data, showMembersCount = true, onUserSelected = ::onUserSelected ) diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt index 01f60847f8..c3a79481e6 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/members/RoomMemberListPresenterTests.kt @@ -55,8 +55,8 @@ class RoomMemberListPresenterTests { val loadedState = awaitItem() Truth.assertThat(loadedState.roomMembers).isInstanceOf(Async.Success::class.java) - Truth.assertThat((loadedState.roomMembers as Async.Success).state.invited).isEqualTo(listOf(aVictor(), aWalter())) - Truth.assertThat((loadedState.roomMembers as Async.Success).state.joined).isNotEmpty() + Truth.assertThat((loadedState.roomMembers as Async.Success).data.invited).isEqualTo(listOf(aVictor(), aWalter())) + Truth.assertThat((loadedState.roomMembers as Async.Success).data.joined).isNotEmpty() } } diff --git a/libraries/architecture/build.gradle.kts b/libraries/architecture/build.gradle.kts index 5d33a08d2d..68a25ead04 100644 --- a/libraries/architecture/build.gradle.kts +++ b/libraries/architecture/build.gradle.kts @@ -26,4 +26,8 @@ dependencies { api(libs.dagger) api(libs.appyx.core) api(libs.androidx.lifecycle.runtime) + + testImplementation(libs.test.junit) + testImplementation(libs.coroutines.test) + testImplementation(libs.test.truth) } diff --git a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt index 301dcfd936..fe728562e9 100644 --- a/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt +++ b/libraries/architecture/src/main/kotlin/io/element/android/libraries/architecture/Async.kt @@ -18,51 +18,152 @@ package io.element.android.libraries.architecture import androidx.compose.runtime.MutableState import androidx.compose.runtime.Stable +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract +/** + * Sealed type that allows to model an asynchronous operation. + */ @Stable sealed interface Async { + + /** + * Represents a failed operation. + * + * @param T the type of data returned by the operation. + * @property error the error that caused the operation to fail. + * @property prevData the data returned by a previous successful run of the operation if any. + */ + data class Failure( + val error: Throwable, + val prevData: T? = null, + ) : Async + + /** + * Represents an operation that is currently ongoing. + * + * @param T the type of data returned by the operation. + * @property prevData the data returned by a previous successful run of the operation if any. + */ + data class Loading( + val prevData: T? = null, + ) : Async + + /** + * Represents a successful operation. + * + * @param T the type of data returned by the operation. + * @property data the data returned by the operation. + */ + data class Success( + val data: T, + ) : Async + + /** + * Represents an uninitialized operation (i.e. yet to be run). + */ object Uninitialized : Async - data class Loading(val prevState: T? = null) : Async - data class Failure(val error: Throwable, val prevState: T? = null) : Async - data class Success(val state: T) : Async - fun dataOrNull(): T? { - return when (this) { - is Failure -> prevState - is Loading -> prevState - is Success -> state - Uninitialized -> null + /** + * Returns the data returned by the operation, or null otherwise. + * + * Please note this method may return stale data if the operation is not [Success]. + */ + fun dataOrNull(): T? = when (this) { + is Failure -> prevData + is Loading -> prevData + is Success -> data + Uninitialized -> null + } + + /** + * Returns the error that caused the operation to fail, or null otherwise. + */ + fun errorOrNull(): Throwable? = when (this) { + is Failure -> error + else -> null + } + + fun isFailure(): Boolean = this is Failure + + fun isLoading(): Boolean = this is Loading + + fun isSuccess(): Boolean = this is Success + + fun isUninitialized(): Boolean = this == Uninitialized +} + +suspend inline fun MutableState>.runCatchingUpdatingState( + errorTransform: (Throwable) -> Throwable = { it }, + block: () -> T, +): Result = runUpdatingState( + state = this, + errorTransform = errorTransform, + resultBlock = { + runCatching { + block() } - } -} + }, +) -suspend inline fun (suspend () -> T).execute( +suspend inline fun (suspend () -> T).runCatchingUpdatingState( state: MutableState>, - errorMapping: ((Throwable) -> Throwable) = { it }, -) { - try { - state.value = Async.Loading() - val result = this() - state.value = Async.Success(result) - } catch (error: Throwable) { - state.value = Async.Failure(errorMapping.invoke(error)) - } -} + errorTransform: (Throwable) -> Throwable = { it }, +): Result = runUpdatingState( + state = state, + errorTransform = errorTransform, + resultBlock = { + runCatching { + this() + } + }, +) -suspend inline fun (suspend () -> Result).executeResult(state: MutableState>) { - if (state.value !is Async.Success) { - state.value = Async.Loading() +suspend inline fun MutableState>.runUpdatingState( + errorTransform: (Throwable) -> Throwable = { it }, + resultBlock: () -> Result, +): Result = runUpdatingState( + state = this, + errorTransform = errorTransform, + resultBlock = resultBlock, +) + +/** + * Calls the specified [Result]-returning function [resultBlock] + * encapsulating its progress and return value into an [Async] while + * posting its updates to the MutableState [state]. + * + * @param T the type of data returned by the operation. + * @param state the [MutableState] to post updates to. + * @param errorTransform a function to transform the error before posting it. + * @param resultBlock a suspending function that returns a [Result]. + * @return the [Result] returned by [resultBlock]. + */ +@OptIn(ExperimentalContracts::class) +@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE") +suspend inline fun runUpdatingState( + state: MutableState>, + errorTransform: (Throwable) -> Throwable = { it }, + resultBlock: suspend () -> Result, +): Result { + contract { + callsInPlace(resultBlock, InvocationKind.EXACTLY_ONCE) } - this().fold( + val prevData = state.value.dataOrNull() + state.value = Async.Loading(prevData = prevData) + return resultBlock().fold( onSuccess = { state.value = Async.Success(it) + Result.success(it) }, onFailure = { - state.value = Async.Failure(it) + val error = errorTransform(it) + state.value = Async.Failure( + error = error, + prevData = prevData, + ) + Result.failure(error) } ) } - -fun Async.isLoading(): Boolean { - return this is Async.Loading -} diff --git a/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt b/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt new file mode 100644 index 0000000000..4b6c75a108 --- /dev/null +++ b/libraries/architecture/src/test/kotlin/io/element/android/libraries/architecture/AsyncKtTest.kt @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * 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 io.element.android.libraries.architecture + +import androidx.compose.runtime.MutableState +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.delay +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class AsyncKtTest { + @Test + fun `updates state when block returns success`() = runTest { + val state = TestableMutableState>(Async.Uninitialized) + + val result = runUpdatingState(state) { + delay(1) + Result.success(1) + } + + assertThat(result.isSuccess).isTrue() + assertThat(result.getOrNull()).isEqualTo(1) + + assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) + assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) + assertThat(state.popFirst()).isEqualTo(Async.Success(1)) + state.assertNoMoreValues() + } + + @Test + fun `updates state when block returns failure`() = runTest { + val state = TestableMutableState>(Async.Uninitialized) + + val result = runUpdatingState(state) { + delay(1) + Result.failure(MyThrowable("hello")) + } + + assertThat(result.isFailure).isTrue() + assertThat(result.exceptionOrNull()).isEqualTo(MyThrowable("hello")) + + assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) + assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) + assertThat(state.popFirst()).isEqualTo(Async.Failure(MyThrowable("hello"))) + state.assertNoMoreValues() + } + + @Test + fun `updates state when block returns failure transforming the error`() = runTest { + val state = TestableMutableState>(Async.Uninitialized) + + val result = runUpdatingState(state, { MyThrowable(it.message + " world") }) { + delay(1) + Result.failure(MyThrowable("hello")) + } + + assertThat(result.isFailure).isTrue() + assertThat(result.exceptionOrNull()).isEqualTo(MyThrowable("hello world")) + + assertThat(state.popFirst()).isEqualTo(Async.Uninitialized) + assertThat(state.popFirst()).isEqualTo(Async.Loading(null)) + assertThat(state.popFirst()).isEqualTo(Async.Failure(MyThrowable("hello world"))) + state.assertNoMoreValues() + } +} + +/** + * A fake [MutableState] that allows to record all the states that were set. + */ +private class TestableMutableState( + value: T +) : MutableState { + + private val _deque = ArrayDeque(listOf(value)) + + override var value: T + get() = _deque.last() + set(value) { + _deque.addLast(value) + } + + /** + * Returns the states that were set in the order they were set. + */ + fun popFirst(): T = _deque.removeFirst() + + fun assertNoMoreValues() { + assertThat(_deque).isEmpty() + } + + override operator fun component1(): T = value + + override operator fun component2(): (T) -> Unit = { value = it } +} + +/** + * An exception that is also a data class so we can compare it using equals. + */ +private data class MyThrowable(val myMessage: String) : Throwable(myMessage) From 0eb195560b9bacd93b0150c43c1264ca317ede70 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Tue, 27 Jun 2023 14:37:44 +0100 Subject: [PATCH 7/8] Danger: remove "add screenshots" warning (#691) We have screenshot tests that basically negate the need for this, and when we're doing more complicated things we tend to use videos anyway which aren't caught by this check. --- tools/danger/dangerfile.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tools/danger/dangerfile.js b/tools/danger/dangerfile.js index 263c394e25..16fbf4d31b 100644 --- a/tools/danger/dangerfile.js +++ b/tools/danger/dangerfile.js @@ -155,14 +155,6 @@ if (buildFilesWithMissingProcessor.length > 0) { warn("You have made changes to a file containing a `@Preview` annotated function but its module doesn't include the showkase processor. Missing processor in: " + buildFilesWithMissingProcessor.join(", ")) } -// Check for screenshots on view changes -const hasChangedViews = filesWithPreviews.length > 0 -if (hasChangedViews) { - if (!pr.body.includes("user-images")) { - warn("You seem to have made changes to views. Please consider adding screenshots.") - } -} - // Check for pngs on resources const hasPngs = editedFiles.filter(file => { file.toLowerCase().endsWith(".png") && !file.includes("snapshots/images/") // Exclude screenshots From 14940d5c34971ca51d28dcc84edcdab7f8e4bc55 Mon Sep 17 00:00:00 2001 From: jonnyandrew Date: Tue, 27 Jun 2023 13:59:00 +0000 Subject: [PATCH 8/8] Link from CONTRIBUTING.md to dev onboarding (#686) * Link from CONTRIBUTING.md to dev onboarding * Update table of contents --- CONTRIBUTING.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 125c69adb6..f50c8f2a89 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,6 +3,7 @@ * [Contributing code to Matrix](#contributing-code-to-matrix) +* [Developer onboarding](#developer-onboarding) * [Android Studio settings](#android-studio-settings) * [Compilation](#compilation) * [Strings](#strings) @@ -32,6 +33,10 @@ Element X Android support can be found in this room: [![Element Android Matrix r The rest of the document contains specific rules for Matrix Android projects +## Developer onboarding + +For a detailed overview of the project, see [Developer Onboarding](./docs/_developer_onboarding.md). + ## Android Studio settings Please set the "hard wrap" setting of Android Studio to 160 chars, this is the setting we use internally to format the source code (Menu `Settings/Editor/Code Style` then `Hard wrap at`).