From 77383cd28998afcc350a460ccba9f76c76bf5ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20=C5=BBerko?= Date: Fri, 18 Oct 2024 16:07:07 +0200 Subject: [PATCH 1/3] fix: update lint baseline [WPB-11603] (#3528) --- app/lint-baseline.xml | 8055 ++++++----------------------- core/ui-common/lint-baseline.xml | 145 +- features/sketch/lint-baseline.xml | 24 +- 3 files changed, 1648 insertions(+), 6576 deletions(-) diff --git a/app/lint-baseline.xml b/app/lint-baseline.xml index 2c6f21819ec..6d9ca54a442 100644 --- a/app/lint-baseline.xml +++ b/app/lint-baseline.xml @@ -1,7352 +1,2589 @@ - + + id="ComposeComposableModifier" + message="Using @Composable builder functions for modifiers is not recommended, as they cause unnecessary recompositions.You should use the Modifier.Node API instead, as it limits recomposition to just the modifier instance, rather than the whole function tree.See https://slackhq.github.io/compose-lints/rules/#avoid-modifier-extension-factory-functions for more information." + errorLine1="@Composable" + errorLine2="^"> + file="src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt" + line="56" + column="1"/> + id="ComposeComposableModifier" + message="Using @Composable builder functions for modifiers is not recommended, as they cause unnecessary recompositions.You should use the Modifier.Node API instead, as it limits recomposition to just the modifier instance, rather than the whole function tree.See https://slackhq.github.io/compose-lints/rules/#avoid-modifier-extension-factory-functions for more information." + errorLine1="@Composable" + errorLine2="^"> + file="src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt" + line="64" + column="1"/> + id="ComposeViewModelForwarding" + message="Forwarding a ViewModel through multiple @Composable functions should be avoided. Consider using state hoisting.See https://slackhq.github.io/compose-lints/rules/#hoist-all-the-things for more information." + errorLine1=" LoginContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/authentication/login/LoginScreen.kt" + line="99" + column="5"/> + id="RestrictedApi" + message="ListenableFutureKt.await can only be called from within the same library group (referenced groupId=`androidx.work` from groupId=`wire-android`)" + errorLine1=" val isAlreadyRunning = getWorkInfosForUniqueWork(MigrationWorker.NAME).await().let { it.firstOrNull()?.state == WorkInfo.State.RUNNING }" + errorLine2=" ~~~~~"> + file="src/main/kotlin/com/wire/android/workmanager/worker/MigrationWorker.kt" + line="114" + column="76"/> + id="RestrictedApi" + message="ListenableFutureKt.await can only be called from within the same library group (referenced groupId=`androidx.work` from groupId=`wire-android`)" + errorLine1=" getWorkInfosForUniqueWork(SingleUserMigrationWorker.NAME).await().let { it.firstOrNull()?.state == WorkInfo.State.RUNNING }" + errorLine2=" ~~~~~"> + file="src/main/kotlin/com/wire/android/workmanager/worker/SingleUserMigrationWorker.kt" + line="113" + column="67"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">විනාඩියකට පෙර</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="455" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Il y a 1 minute</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-fr/strings.xml" + line="456" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 минуту назад</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="485" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Você adicionou uma pessoa à conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="569" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Você e uma outra pessoa foram adicionados à conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="574" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Uma pessoa foi adicionada à conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="578" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Você removeu uma pessoa da conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="582" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Você e uma outra pessoa foram removidos da conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="587" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Uma pessoa foi removida da conversa</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-pt/strings.xml" + line="591" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ඔබ පුද්ගලයෙක් සංවාදයට එක් කළා</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="610" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ඔබව සහ තවත් පුද්ගලයෙක් සංවාදයට එක් කර ඇත</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="615" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">පුද්ගලයෙක් සංවාදයට එක් කර ඇත</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="619" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ඔබ පුද්ගලයෙක් සංවාදයෙන් ඉවත් කළා</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="623" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ඔබව සහ තවත් පුද්ගලයෙක් සංවාදයෙන් ඉවත් කර ඇත</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="628" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">පුද්ගලයෙක් සංවාදයෙන් ඉවත් කර ඇත</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="632" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Вы добавили 1 пользователя в беседу</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="659" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Вы и еще 1 пользователь были добавлены к беседе</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="666" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">මගහැරුණු ඇමතුමක්</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="667" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">В беседу был добавлен 1 пользователь</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="672" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Вы удалили из беседы 1 пользователя</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="678" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 пользователь был удален из команды</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="684" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Вы и еще 1 пользователь были удалены из беседы</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="691" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 пользователь был удален из беседы</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="697" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ගිණුමක් සක්‍රියයි</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="969" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">ඔබට එක් ගිණුමකට පමණක් එකවර පිවිසීමට හැකිය. තව ගිණුමක් එකතු කිරීමට එකකින් නික්මෙන්න.</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="973" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">активен один аккаунт</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1065" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Одновременно можно авторизоваться только в одном аккаунте. Выйдите, чтобы добавить другой.</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1071" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">සතියක් ඉතිරිය</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1164" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">දවසක් ඉතිරිය</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1168" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">පැයක් ඉතිරිය</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1172" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">විනාඩියක් ඉතිරිය</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1176" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">තත්පරයක් ඉතිරිය</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1180" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">සති 1</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1184" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">දවස් 1</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1188" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">පැය 1</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1192" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">විනාඩි 1</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1196" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (0, 1), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">තත්. 1</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-si/strings.xml" + line="1200" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Осталась 1 неделя</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1281" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Остался 1 день</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1287" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Остался 1 час</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1293" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Осталась 1 минута</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1299" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">Осталась 1 секунда</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1305" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 неделя</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1311" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 день</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1317" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 час</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1323" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 минуту</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1329" + column="9"/> + id="ImpliedQuantity" + message="The quantity `'one'` matches more than one specific number in this locale (1, 21, 31, 41, 51, 61, 71, 81, 101, 1001, …), but the message did not include a formatting argument (such as `%d`). This is usually an internationalization error. See full issue explanation for more." + errorLine1=" <item quantity="one">1 секунда</item>" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/res/values-ru/strings.xml" + line="1335" + column="9"/> + id="ComposeContentEmitterReturningValues" + message="Composable functions should either emit content into the composition or return a value, but not both.If a composable should offer additional control surfaces to its caller, those control surfaces or callbacks should be provided as parameters to the composable function by the caller.See https://slackhq.github.io/compose-lints/rules/#do-not-emit-content-and-return-a-result for more information." + errorLine1="@Composable" + errorLine2="^"> + file="src/main/kotlin/com/wire/android/ui/common/dialogs/CustomServerDialog.kt" + line="147" + column="1"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun AppSettingsScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/appsettings/AppSettingsScreen.kt" + line="41" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun AppearanceScreenContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/appearance/AppearanceScreen.kt" + line="75" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ThemeOptionItem(" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/appearance/AppearanceScreen.kt" + line="126" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun UploadInProgressAssetMessage() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/asset/AssetMessageTypes.kt" + line="158" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RestrictedAssetMessage(assetTypeIcon: Int, restrictedAssetMessage: String) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/asset/AssetMessageTypes.kt" + line="181" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RestrictedGenericFileMessage(fileName: String, fileSize: Long) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/asset/AssetMessageTypes.kt" + line="216" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun WireBottomNavigationBar(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/BottomNavigation.kt" + line="53" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun BulletHoleImagePreview(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/imagepreview/BulletHoleImagePreview.kt" + line="64" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun CreateGuestLinkButton(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/Buttons.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun CopyLinkButton(" + errorLine2=" ~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/Buttons.kt" + line="55" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ShareLinkButton(" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/Buttons.kt" + line="71" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RevokeLinkButton(" + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/Buttons.kt" + line="88" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun CallVideoPreview(" + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/calling/common/CallVideoPreview.kt" + line="32" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun CallerDetails(" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/calling/common/CallerDetails.kt" + line="64" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ChangeDisplayNameContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameScreen.kt" + line="100" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ChangeHandleContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/handle/ChangeHandleScreen.kt" + line="81" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ConnectionActionButton(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/connection/ConnectionActionButton.kt" + line="63" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ConnectionLabel(connectionInfo: UILastMessageContent.Connection) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversationslist/common/ConnectionLabel.kt" + line="34" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun DropDownMentionsSuggestions(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/messagecomposer/DropDownMentionsSuggestions.kt" + line="45" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun E2EISuccessDialog(" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/E2EIDialogs.kt" + line="148" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun EditSelfDeletingMessagesScreen(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt" + line="65" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SelectableSelfDeletingItem(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt" + line="136" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun EmptyMediaContentScreen(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/media/EmptyMediaContentScreen.kt" + line="41" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun EmptySearchQueryScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/EmptySearchQueryScreen.kt" + line="48" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun EndToEndIdentityCertificateItem(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/settings/devices/EndToEndIdentityCertificateItem.kt" + line="54" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun GetE2eiCertificateButton(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/settings/devices/button/GetE2eiCertificateButton.kt" + line="32" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun GuestLinkActionButtons(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/GuestLinkActionButtons.kt" + line="26" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun HighlightSubtitle(" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/HighLightSubtTitle.kt" + line="34" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun HomeDrawer(" + errorLine2=" ~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt" + line="57" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun DrawerItem(destination: HomeDestination, selected: Boolean, unreadCount: Int = 0, onItemClick: () -> Unit) {" + errorLine2=" ~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/drawer/HomeDrawer.kt" + line="114" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x2() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="30" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x4() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="35" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x8() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="40" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x12() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="45" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x16() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="50" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x24() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="55" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x32() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="60" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x48() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="65" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ImageMessageInProgress(width: Dp, height: Dp, isDownloading: Boolean, showText: Boolean = true) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/image/ImageMessageTypes.kt" + line="122" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ImageMessageFailed(width: Dp, height: Dp, isDownloadFailure: Boolean) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/image/ImageMessageTypes.kt" + line="154" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun Label(" + errorLine2=" ~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/textfield/Label.kt" + line="39" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LegalHoldDeactivatedDialog(dialogDismissed: () -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/legalhold/dialog/deactivated/LegalHoldDeactivatedDialog.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LegalHoldStatusBar(" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/legalhold/banner/LegalHoldStatusBar.kt" + line="48" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LegalHoldSubjectBaseDialog(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/legalhold/dialog/subject/LegalHoldSubjectBaseDialog.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LegalHoldSubjectConnectionFailedDialog(dialogDismissed: () -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/legalhold/dialog/connectionfailed/LegalHoldSubjectConnectionFailedDialog.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LibraryItem(" + errorLine2=" ~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/about/licenses/LicensesItem.kt" + line="82" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LicensesContent(" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/about/licenses/LicensesScreen.kt" + line="62" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LocationMessageContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/location/LocationMessageType.kt" + line="56" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun LogoutOptionsDialog(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/userprofile/self/dialog/LogoutOptionsDialog.kt" + line="42" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownBlockQuote(blockQuote: MarkdownNode.Block.BlockQuote, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownBlockQuote.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownIndentedCodeBlock(indentedCodeBlock: MarkdownNode.Block.IntendedCode, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownCodeBlock.kt" + line="34" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownFencedCodeBlock(fencedCodeBlock: MarkdownNode.Block.FencedCode, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownCodeBlock.kt" + line="48" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownNodeBlockChildren(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownComposer.kt" + line="61" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownHeading(heading: MarkdownNode.Block.Heading, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownHeading.kt" + line="30" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownBulletList(bulletList: MarkdownNode.Block.ListBlock.Bullet, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownList.kt" + line="32" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownOrderedList(orderedList: MarkdownNode.Block.ListBlock.Ordered, nodeData: NodeData) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownList.kt" + line="57" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownParagraph(" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownParagraph.kt" + line="30" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MarkdownTable(tableBlock: MarkdownNode.Block.Table, nodeData: NodeData, onMentionsUpdate: (List<DisplayMention>) -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownTable.kt" + line="37" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MessageDetailsReactions(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsReactions.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MessageDetailsReadReceipts(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsReadReceipts.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MutedConversationBadge() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversationslist/common/MutedConversationBadge.kt" + line="45" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun MyAccountContent(" + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountScreen.kt" + line="175" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun NetworkSettingsScreenContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/appsettings/networkSettings/NetworkSettingsScreen.kt" + line="59" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun OtherUserConnectionStatusInfo(connectionStatus: ConnectionState, membership: Membership) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserConnectionStatusInfo.kt" + line="43" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun OtherUserConnectionUnverifiedWarning(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserConnectionUnverifiedWarning.kt" + line="42" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun OtherUserProfileDetails(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileDetails.kt" + line="42" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun OtherUserProfileGroup(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileGroup.kt" + line="56" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun PasswordProtectedLinkBanner() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/PasswordProtectedLinkBanner.kt" + line="44" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun QuotedMessagePreview(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="168" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ReactionOption(" + errorLine2=" ~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/edit/ReactionOption.kt" + line="61" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RemoveDeviceTopBar(elevation: Dp, onBackButtonClicked: () -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceTopBar.kt" + line="38" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ResendCodeText(onResendCodePressed: () -> Unit, clickEnabled: Boolean) {" + errorLine2=" ~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/verificationcode/ResendCodeText.kt" + line="37" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SelectableMenuBottomSheetItem(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt" + line="48" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SearchAndMediaRow(" + errorLine2=" ~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/SearchAndMediaRow.kt" + line="30" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SearchConversationMessagesNoResultsScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesNoResultsScreen.kt" + line="42" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SearchFailureBox(@StringRes failureMessage: Int) {" + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/widget/SearchFailureWidget.kt" + line="37" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SettingUpWireScreenContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/SettingUpWireScreenContent.kt" + line="55" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SettingsItem(" + errorLine2=" ~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt" + line="62" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun SettingsOptionSwitch(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/SettingsOptionSwitch.kt" + line="33" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ShakeAnimation(offset: Dp = dimensions().spacing12x, duration: Int = 160, animateContent: @Composable (() -> Unit) -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/ShakeAnimation.kt" + line="33" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ShowE2eiCertificateButton(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/settings/devices/button/ShowE2eiCertificateButton.kt" + line="35" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun UnderConstructionScreen(screenName: String) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/UnderConstructionScreen.kt" + line="44" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun UpdateE2eiCertificateButton(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/settings/devices/button/UpdateE2eiCertificateButton.kt" + line="32" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun UserBadge(" + errorLine2=" ~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/UserBadge.kt" + line="46" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun VerificationCode(" + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/verificationcode/VerificationCode.kt" + line="44" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RowScope.ConversationVerificationIcons(" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/VerifiedIcons.kt" + line="35" + column="14"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun RowScope.MLSVerificationIcon(mlsVerificationStatus: MLSClientE2EIStatus?) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/VerifiedIcons.kt" + line="71" + column="14"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun VerifyEmailContent(" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/email/verifyEmail/VerifyEmailScreen.kt" + line="72" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x4() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="30" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x8() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="35" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x16() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="40" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x24() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="45" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1=" fun x32() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="50" + column="9"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun WireCheckIcon() {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/WireCheckIcon.kt" + line="33" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun WireRadioButton(" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/WireRadioButton.kt" + line="26" + column="5"/> + id="ComposeModifierMissing" + message="This @Composable function emits content but doesn't have a modifier parameter.See https://slackhq.github.io/compose-lints/rules/#when-should-i-expose-modifier-parameters for more information." + errorLine1="fun ZoomableImage(imageAsset: ImageAsset.Remote, contentDescription: String) {" + errorLine2=" ~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/gallery/ZoomableImage.kt" + line="38" + column="5"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" QuotedMessageContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="501" + column="5"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" Icon(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="512" + column="13"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" QuotedMessageContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="575" + column="5"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" Icon(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="583" + column="13"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" QuotedMessageContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="605" + column="5"/> + id="ComposeModifierReused" + message="Modifiers should only be used once and by the root level layout of a Composable. This is true even if appended to or with other modifiers e.g. modifier.fillMaxWidth().Use Modifier (with a capital 'M') to construct a new Modifier that you can pass to other composables.See https://slackhq.github.io/compose-lints/rules/#dont-re-use-modifiers for more information." + errorLine1=" Icon(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="611" + column="13"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1="fun Modifier.selectableBackground(isSelected: Boolean, onClick: () -> Unit): Modifier =" + errorLine2=" ~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt" + line="57" + column="35"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" visible: Boolean," + errorLine2=" ~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt" + line="66" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/calling/ongoing/fullscreen/DoubleTapToast.kt" + line="49" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOScreen.kt" + line="155" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1="private fun LoginButton(modifier: Modifier, loading: Boolean, enabled: Boolean, onClick: () -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/login/sso/LoginSSOScreen.kt" + line="169" + column="25"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/messagecomposer/MembersMentionList.kt" + line="39" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsEmptyScreenText.kt" + line="48" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="381" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="496" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="572" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="602" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/messagecomposer/RichTextOptions.kt" + line="86" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/messagecomposer/RichTextOptions.kt" + line="107" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/messagecomposer/RichTextOptions.kt" + line="127" + column="5"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1="private fun WelcomeFooter(modifier: Modifier, onPrivateAccountClick: () -> Unit) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeScreen.kt" + line="340" + column="27"/> + id="ComposeModifierWithoutDefault" + message="This @Composable function has a modifier parameter but it doesn't have a default value.See https://slackhq.github.io/compose-lints/rules/#modifiers-should-have-default-parameters for more information." + errorLine1=" modifier: Modifier," + errorLine2=" ~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/WireDropDown.kt" + line="78" + column="5"/> + id="ComposeMultipleContentEmitters" + message="Composable functions should only be emitting content into the composition from one source at their top level. See https://slackhq.github.io/compose-lints/rules/#do-not-emit-multiple-pieces-of-content for more information." + errorLine1="@Composable" + errorLine2="^"> + file="src/main/kotlin/com/wire/android/ui/common/dialogs/CustomServerDialog.kt" + line="147" + column="1"/> + id="ComposeNamingLowercase" + message="Composable functions that return a value should start with a lowercase letter.While useful and accepted outside of @Composable functions, this factory function convention has drawbacks that set inappropriate expectations for callers when used with @Composable functions.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun BottomNavigationBarHeight(): Dp {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/common/bottombar/BottomNavigationBarHeight.kt" + line="29" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewE2EIEnrollmentScreenContent() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt" + line="225" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewE2EIEnrollmentScreenContentWithSuccess() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt" + line="233" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewE2EIEnrollmentScreenContentWithError() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt" + line="241" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewAssetEmptyMediaContentScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/media/EmptyMediaContentScreen.kt" + line="64" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewPictureEmptyMediaContentScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/media/EmptyMediaContentScreen.kt" + line="74" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x2() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="30" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x4() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="35" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x8() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="40" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x12() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="45" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x16() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="50" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x24() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="55" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x32() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="60" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x48() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/HorizontalSpace.kt" + line="65" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="private fun <T : DestinationSpec<*>> handleNavResult(" + errorLine2=" ~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/MyAccountScreen.kt" + line="116" + column="38"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewSearchConversationMessagesEmptyScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesEmptyScreen.kt" + line="82" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewSearchConversationMessagesNoResultsScreen() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/search/messages/SearchConversationMessagesNoResultsScreen.kt" + line="62" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1="fun previewFileRestrictionDialog() {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt" + line="230" + column="5"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x4() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="30" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x8() {" + errorLine2=" ~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="35" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x16() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="40" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x24() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="45" + column="9"/> + id="ComposeNamingUppercase" + message="Composable functions that return Unit should start with an uppercase letter.They are considered declarative entities that can be either present or absent in a composition and therefore follow the naming rules for classes.See https://slackhq.github.io/compose-lints/rules/#naming-composable-functions-properly for more information." + errorLine1=" fun x32() {" + errorLine2=" ~~~"> + file="src/main/kotlin/com/wire/android/ui/common/spacers/VerticalSpace.kt" + line="50" + column="9"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [appUnlockWithBiometricsViewModel: AppUnlockWithBiometricsViewModel = hiltViewModel(), navigator: Navigator] but should be [navigator: Navigator, appUnlockWithBiometricsViewModel: AppUnlockWithBiometricsViewModel = hiltViewModel()]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun AppUnlockWithBiometricsScreen(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/appLock/unlock/AppUnlockWithBiometricsScreen.kt" + line="52" + column="34"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [lazyListState: LazyListState = rememberLazyListState(), state: AppearanceState, onThemeOptionChanged: (ThemeOption) -> Unit, onBackPressed: () -> Unit] but should be [state: AppearanceState, onThemeOptionChanged: (ThemeOption) -> Unit, lazyListState: LazyListState = rememberLazyListState(), onBackPressed: () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun AppearanceScreenContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/settings/appearance/AppearanceScreen.kt" + line="75" + column="28"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [viewModel: ChangeDisplayNameViewModel = hiltViewModel(), navigator: Navigator, resultNavigator: ResultBackNavigator<Boolean>] but should be [navigator: Navigator, resultNavigator: ResultBackNavigator<Boolean>, viewModel: ChangeDisplayNameViewModel = hiltViewModel()]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun ChangeDisplayNameScreen(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/settings/account/displayname/ChangeDisplayNameScreen.kt" + line="72" + column="28"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [text: AnnotatedString, modifier: Modifier = Modifier, color: Color = Color.Unspecified, textDecoration: TextDecoration? = null, textAlign: TextAlign? = null, overflow: TextOverflow = TextOverflow.Clip, softWrap: Boolean = true, maxLines: Int = Int.MAX_VALUE, onTextLayout: (TextLayoutResult) -> Unit = {}, style: TextStyle = LocalTextStyle.current, onClick: (Int) -> Unit, onLongClick: (() -> Unit)? = null] but should be [text: AnnotatedString, onClick: (Int) -> Unit, modifier: Modifier = Modifier, color: Color = Color.Unspecified, textDecoration: TextDecoration? = null, textAlign: TextAlign? = null, overflow: TextOverflow = TextOverflow.Clip, softWrap: Boolean = true, maxLines: Int = Int.MAX_VALUE, onTextLayout: (TextLayoutResult) -> Unit = {}, style: TextStyle = LocalTextStyle.current, onLongClick: (() -> Unit)? = null]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun ClickableText(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/ClickableText.kt" + line="45" + column="18"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [name: String, isLegalHold: Boolean = false, modifier: Modifier = Modifier, badges: @Composable () -> Unit = {}, searchQuery: String] but should be [name: String, searchQuery: String, modifier: Modifier = Modifier, isLegalHold: Boolean = false, badges: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun ConversationTitle(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversationslist/common/ConversationTitle.kt" + line="37" + column="22"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [onCopyClicked: () -> Unit, state: WireButtonState = WireButtonState.Default, modifier: Modifier = Modifier] but should be [onCopyClicked: () -> Unit, modifier: Modifier = Modifier, state: WireButtonState = WireButtonState.Default]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun CopyButton(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/CopyButton.kt" + line="28" + column="15"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [modifier: Modifier = Modifier, unreadMessageCount: Int] but should be [unreadMessageCount: Int, modifier: Modifier = Modifier]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun UnreadMessageEventBadge(modifier: Modifier = Modifier, unreadMessageCount: Int) {" + errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"> + file="src/main/kotlin/com/wire/android/ui/home/conversationslist/common/EventBadge.kt" + line="157" + column="28"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [title: String, clickable: Clickable = Clickable(enabled = false, onClick = { /* not handled */ }, onLongClick = { /* not handled */ }), modifier: Modifier = Modifier .fillMaxWidth() .background(MaterialTheme.wireColorScheme.surface) .clickable(clickable) .defaultMinSize(minHeight = MaterialTheme.wireDimensions.conversationOptionsItemMinHeight), subtitle: String? = null, label: String? = null, trailingOnText: String? = null, titleTrailingItem: (@Composable () -> Unit)? = null, footer: (@Composable () -> Unit)? = null, switchState: SwitchState = SwitchState.None, titleStyle: TextStyle = MaterialTheme.wireTypography.body02, arrowType: ArrowType = ArrowType.CENTER_ALIGNED] but should be [title: String, modifier: Modifier = Modifier .fillMaxWidth() .background(MaterialTheme.wireColorScheme.surface) .clickable(clickable) .defaultMinSize(minHeight = MaterialTheme.wireDimensions.conversationOptionsItemMinHeight), clickable: Clickable = Clickable(enabled = false, onClick = { /* not handled */ }, onLongClick = { /* not handled */ }), subtitle: String? = null, label: String? = null, trailingOnText: String? = null, titleTrailingItem: (@Composable () -> Unit)? = null, footer: (@Composable () -> Unit)? = null, switchState: SwitchState = SwitchState.None, titleStyle: TextStyle = MaterialTheme.wireTypography.body02, arrowType: ArrowType = ArrowType.CENTER_ALIGNED]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun GroupConversationOptionsItem(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptionsItem.kt" + line="51" + column="33"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [onClick: () -> Unit = {}, modifier: Modifier = Modifier, content: @Composable () -> Unit] but should be [modifier: Modifier = Modifier, onClick: () -> Unit = {}, content: @Composable () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun LegalHoldBaseBanner(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/legalhold/banner/LegalHoldBaseBanner.kt" + line="37" + column="24"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [onClick: () -> Unit = {}, modifier: Modifier = Modifier] but should be [modifier: Modifier = Modifier, onClick: () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun LegalHoldPendingBanner(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/legalhold/banner/LegalHoldPendingBanner.kt" + line="35" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [onClick: () -> Unit = {}, modifier: Modifier = Modifier] but should be [modifier: Modifier = Modifier, onClick: () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun LegalHoldSubjectBanner(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/legalhold/banner/LegalHoldSubjectBanner.kt" + line="33" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [title: String, customInfo: String? = null, withDefaultInfo: Boolean, cancelText: String, dialogDismissed: () -> Unit, action: Pair<String, () -> Unit>? = null] but should be [title: String, withDefaultInfo: Boolean, cancelText: String, dialogDismissed: () -> Unit, customInfo: String? = null, action: Pair<String, () -> Unit>? = null]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun LegalHoldSubjectBaseDialog(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/legalhold/dialog/subject/LegalHoldSubjectBaseDialog.kt" + line="35" + column="31"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [libraries: List<Library>, modifier: Modifier = Modifier, lazyListState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(0.dp), onLibraryClick: (Library) -> Unit, header: (LazyListScope.() -> Unit)? = null] but should be [libraries: List<Library>, onLibraryClick: (Library) -> Unit, modifier: Modifier = Modifier, lazyListState: LazyListState = rememberLazyListState(), contentPadding: PaddingValues = PaddingValues(0.dp), header: (LazyListScope.() -> Unit)? = null]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun WireLibraries(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/settings/about/licenses/LicensesItem.kt" + line="44" + column="18"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [inlines: List<MarkdownNode.Inline>, maxLines: Int = 1, nodeData: NodeData] but should be [inlines: List<MarkdownNode.Inline>, nodeData: NodeData, maxLines: Int = 1]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MarkdownInline(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/markdown/MarkdownInline.kt" + line="25" + column="19"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [maxAccountsAllowed: Int = BuildConfig.MAX_ACCOUNTS, @PluralsRes title: Int = R.plurals.max_account_reached_dialog_title, @PluralsRes message: Int = R.plurals.max_account_reached_dialog_message, @StringRes buttonText: Int, dialogProperties: DialogProperties = DialogProperties(usePlatformDefaultWidth = false), onConfirm: () -> Unit, onDismiss: () -> Unit] but should be [@StringRes buttonText: Int, onConfirm: () -> Unit, maxAccountsAllowed: Int = BuildConfig.MAX_ACCOUNTS, @PluralsRes title: Int = R.plurals.max_account_reached_dialog_title, @PluralsRes message: Int = R.plurals.max_account_reached_dialog_message, dialogProperties: DialogProperties = DialogProperties(usePlatformDefaultWidth = false), onDismiss: () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MaxAccountAllowedDialogContent(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/dialogs/MaxAccountsReachedDialog.kt" + line="57" + column="35"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [showAuthor: Boolean = true, useSmallBottomPadding: Boolean = false, fullAvatarOuterPadding: Dp, modifier: Modifier = Modifier, leading: @Composable () -> Unit, content: @Composable () -> Unit] but should be [fullAvatarOuterPadding: Dp, leading: @Composable () -> Unit, modifier: Modifier = Modifier, showAuthor: Boolean = true, useSmallBottomPadding: Boolean = false, content: @Composable () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MessageItemTemplate(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/item/MessageItemTemplate.kt" + line="33" + column="24"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [status: MessageFlowStatus, isGroupConversation: Boolean = false, modifier: Modifier = Modifier] but should be [status: MessageFlowStatus, modifier: Modifier = Modifier, isGroupConversation: Boolean = false]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MessageStatusIndicator(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/item/MessageStatusIndicator.kt" + line="39" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [isMuted: Boolean, onMicrophoneButtonClicked: () -> Unit, size: Dp = dimensions().defaultCallingControlsSize, modifier: Modifier = Modifier] but should be [isMuted: Boolean, onMicrophoneButtonClicked: () -> Unit, modifier: Modifier = Modifier, size: Dp = dimensions().defaultCallingControlsSize]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MicrophoneButton(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/calling/controlbuttons/MicrophoneButton.kt" + line="30" + column="21"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [onButtonClicked: () -> Unit, state: WireButtonState = WireButtonState.Default, modifier: Modifier = Modifier] but should be [onButtonClicked: () -> Unit, modifier: Modifier = Modifier, state: WireButtonState = WireButtonState.Default]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MoreOptionIcon(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/MoreOptionIcon.kt" + line="28" + column="19"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [state: OtherUserProfileState, lazyListState: LazyListState = rememberLazyListState(), onRemoveFromConversation: (RemoveConversationMemberState) -> Unit, openChangeRoleBottomSheet: () -> Unit] but should be [state: OtherUserProfileState, onRemoveFromConversation: (RemoveConversationMemberState) -> Unit, lazyListState: LazyListState = rememberLazyListState(), openChangeRoleBottomSheet: () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun OtherUserProfileGroup(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileGroup.kt" + line="56" + column="26"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [label: String, value: AnnotatedString, clickable: Clickable = Clickable(enabled = false) {}, isSelfAdmin: Boolean, isRoleEditable: Boolean, openChangeRoleBottomSheet: () -> Unit] but should be [label: String, value: AnnotatedString, isSelfAdmin: Boolean, isRoleEditable: Boolean, clickable: Clickable = Clickable(enabled = false) {}, openChangeRoleBottomSheet: () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun UserRoleInformation(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileGroup.kt" + line="132" + column="32"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [title: String, properties: DialogProperties = DialogProperties(usePlatformDefaultWidth = false), modifier: Modifier = Modifier, shape: Shape = RoundedCornerShape(MaterialTheme.wireDimensions.dialogCornerSize), onDismiss: () -> Unit = {}] but should be [title: String, modifier: Modifier = Modifier, properties: DialogProperties = DialogProperties(usePlatformDefaultWidth = false), shape: Shape = RoundedCornerShape(MaterialTheme.wireDimensions.dialogCornerSize), onDismiss: () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun ProgressDialog(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/dialogs/ProgressDialog.kt" + line="42" + column="19"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [messageData: UIQuotedMessage.UIQuotedData, style: QuotedMessageStyle = COMPLETE, clickable: Clickable?, modifier: Modifier = Modifier, startContent: @Composable () -> Unit = {}] but should be [messageData: UIQuotedMessage.UIQuotedData, clickable: Clickable?, modifier: Modifier = Modifier, style: QuotedMessageStyle = COMPLETE, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="internal fun QuotedMessage(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="97" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [senderName: UIText, originalDateDescription: UIText, style: QuotedMessageStyle, modifier: Modifier = Modifier, startContent: @Composable () -> Unit = {}, clickable: Clickable?] but should be [senderName: UIText, originalDateDescription: UIText, style: QuotedMessageStyle, clickable: Clickable?, modifier: Modifier = Modifier, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun QuotedDeleted(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="307" + column="26"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [text: String, editedTimeDescription: UIText?, originalDateTimeDescription: UIText, senderName: UIText, modifier: Modifier = Modifier, startContent: @Composable () -> Unit = {}, style: QuotedMessageStyle, clickable: Clickable?] but should be [text: String, editedTimeDescription: UIText?, originalDateTimeDescription: UIText, senderName: UIText, style: QuotedMessageStyle, clickable: Clickable?, modifier: Modifier = Modifier, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun QuotedText(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="331" + column="23"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [senderName: UIText, asset: ImageAsset.PrivateAsset, originalDateTimeText: UIText, startContent: @Composable () -> Unit = {}, style: QuotedMessageStyle, modifier: Modifier, clickable: Clickable?] but should be [senderName: UIText, asset: ImageAsset.PrivateAsset, originalDateTimeText: UIText, style: QuotedMessageStyle, modifier: Modifier, clickable: Clickable?, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun QuotedImage(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="375" + column="24"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [modifier: Modifier = Modifier, asset: ImageAsset.PrivateAsset, clickable: Clickable? = null, content: @Composable () -> Unit] but should be [asset: ImageAsset.PrivateAsset, modifier: Modifier = Modifier, clickable: Clickable? = null, content: @Composable () -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun AutosizeContainer(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="438" + column="30"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [senderName: UIText, originalDateTimeText: UIText, assetName: String?, style: QuotedMessageStyle, startContent: @Composable () -> Unit = {}, modifier: Modifier, clickable: Clickable?] but should be [senderName: UIText, originalDateTimeText: UIText, assetName: String?, style: QuotedMessageStyle, modifier: Modifier, clickable: Clickable?, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun QuotedGenericAsset(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="566" + column="31"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [senderName: UIText, originalDateTimeText: UIText, locationName: String, style: QuotedMessageStyle, startContent: @Composable () -> Unit = {}, modifier: Modifier, clickable: Clickable?] but should be [senderName: UIText, originalDateTimeText: UIText, locationName: String, style: QuotedMessageStyle, modifier: Modifier, clickable: Clickable?, startContent: @Composable () -> Unit = {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun QuotedLocation(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt" + line="596" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [title: String, titleStyleUnselected: TextStyle = MaterialTheme.wireTypography.body02, titleStyleSelected: TextStyle = MaterialTheme.wireTypography.body02, state: RichMenuItemState = RichMenuItemState.DEFAULT, color: Color? = null, modifier: Modifier = Modifier] but should be [title: String, modifier: Modifier = Modifier, titleStyleUnselected: TextStyle = MaterialTheme.wireTypography.body02, titleStyleSelected: TextStyle = MaterialTheme.wireTypography.body02, state: RichMenuItemState = RichMenuItemState.DEFAULT, color: Color? = null]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun MenuItemHeading(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt" + line="102" + column="20"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [leadingIcon: @Composable () -> Unit = {}, title: @Composable () -> Unit = {}, titleStartPadding: Dp = dimensions().spacing8x, subtitle: @Composable () -> Unit = {}, actions: @Composable () -> Unit = {}, clickable: Clickable = Clickable(false) {}, modifier: Modifier = Modifier] but should be [modifier: Modifier = Modifier, leadingIcon: @Composable () -> Unit = {}, title: @Composable () -> Unit = {}, titleStartPadding: Dp = dimensions().spacing8x, subtitle: @Composable () -> Unit = {}, actions: @Composable () -> Unit = {}, clickable: Clickable = Clickable(false) {}]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun RowItemTemplate(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/RowItemTemplate.kt" + line="33" + column="20"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [leadingIcon: @Composable () -> Unit, title: @Composable () -> Unit, subTitle: @Composable () -> Unit = {}, clickable: Clickable, trailingIcon: @Composable () -> Unit = { }, modifier: Modifier = Modifier] but should be [leadingIcon: @Composable () -> Unit, title: @Composable () -> Unit, clickable: Clickable, modifier: Modifier = Modifier, subTitle: @Composable () -> Unit = {}, trailingIcon: @Composable () -> Unit = { }]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun RowItemTemplate(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/RowItemTemplate.kt" + line="66" + column="20"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [conversationId: ConversationId, viewModel: SecurityClassificationViewModel = hiltViewModelScoped<SecurityClassificationViewModelImpl, SecurityClassificationViewModel, SecurityClassificationArgs>( SecurityClassificationArgs.Conversation(id = conversationId) ), modifier: Modifier = Modifier] but should be [conversationId: ConversationId, modifier: Modifier = Modifier, viewModel: SecurityClassificationViewModel = hiltViewModelScoped<SecurityClassificationViewModelImpl, SecurityClassificationViewModel, SecurityClassificationArgs>( SecurityClassificationArgs.Conversation(id = conversationId) )]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun SecurityClassificationBannerForConversation(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationBanner.kt" + line="52" + column="48"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [userId: UserId, viewModel: SecurityClassificationViewModel = hiltViewModelScoped<SecurityClassificationViewModelImpl, SecurityClassificationViewModel, SecurityClassificationArgs>( SecurityClassificationArgs.User(id = userId) ), modifier: Modifier = Modifier] but should be [userId: UserId, modifier: Modifier = Modifier, viewModel: SecurityClassificationViewModel = hiltViewModelScoped<SecurityClassificationViewModelImpl, SecurityClassificationViewModel, SecurityClassificationArgs>( SecurityClassificationArgs.User(id = userId) )]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun SecurityClassificationBannerForUser(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/banner/SecurityClassificationBanner.kt" + line="67" + column="40"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [title: String? = null, text: String, @DrawableRes trailingIcon: Int? = null, switchState: SwitchState = SwitchState.None, onRowPressed: Clickable = Clickable(false), onIconPressed: Clickable? = null] but should be [text: String, title: String? = null, @DrawableRes trailingIcon: Int? = null, switchState: SwitchState = SwitchState.None, onRowPressed: Clickable = Clickable(false), onIconPressed: Clickable? = null]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun SettingsItem(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt" + line="62" + column="17"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [isSpeakerOn: Boolean, onSpeakerButtonClicked: () -> Unit, size: Dp = dimensions().defaultCallingControlsSize, modifier: Modifier = Modifier] but should be [isSpeakerOn: Boolean, onSpeakerButtonClicked: () -> Unit, modifier: Modifier = Modifier, size: Dp = dimensions().defaultCallingControlsSize]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun SpeakerButton(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/calling/controlbuttons/SpeakerButton.kt" + line="30" + column="18"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [isSelected: Boolean, @DrawableRes iconResId: Int, @StringRes contentDescription: Int, onClick: () -> Unit, size: Dp = dimensions().defaultCallingControlsSize, iconSize: Dp = dimensions().defaultCallingControlsIconSize, modifier: Modifier = Modifier] but should be [isSelected: Boolean, @DrawableRes iconResId: Int, @StringRes contentDescription: Int, onClick: () -> Unit, modifier: Modifier = Modifier, size: Dp = dimensions().defaultCallingControlsSize, iconSize: Dp = dimensions().defaultCallingControlsIconSize]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun WireCallControlButton(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/calling/controlbuttons/WireCallControlButton.kt" + line="36" + column="26"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [items: List<String>, defaultItemIndex: Int = -1, selectedItemIndex: Int = defaultItemIndex, label: String?, modifier: Modifier, autoUpdateSelection: Boolean = true, showDefaultTextIndicator: Boolean = true, leadingCompose: @Composable ((index: Int) -> Unit)? = null, onSelected: (selectedIndex: Int) -> Unit] but should be [items: List<String>, label: String?, modifier: Modifier, defaultItemIndex: Int = -1, selectedItemIndex: Int = defaultItemIndex, autoUpdateSelection: Boolean = true, showDefaultTextIndicator: Boolean = true, leadingCompose: @Composable ((index: Int) -> Unit)? = null, onSelected: (selectedIndex: Int) -> Unit]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="internal fun WireDropDown(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/WireDropDown.kt" + line="73" + column="26"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [modifier: Modifier = Modifier, leadingCompose: @Composable ((index: Int) -> Unit)?, selectedIndex: Int, text: String, arrowRotation: Float] but should be [leadingCompose: @Composable ((index: Int) -> Unit)?, selectedIndex: Int, text: String, arrowRotation: Float, modifier: Modifier = Modifier]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="private fun SelectionField(" + errorLine2=" ^"> + file="src/main/kotlin/com/wire/android/ui/common/WireDropDown.kt" + line="208" + column="27"/> + id="ComposeParameterOrder" + message="Parameters in a composable function should be ordered following this pattern: params without defaults, modifiers, params with defaults and optionally, a trailing function that might not have a default param. Current params are: [label: String, checked: Boolean, onCheckClicked: ((Boolean) -> Unit), maxLine: Int = Int.MAX_VALUE, overflow: TextOverflow = TextOverflow.Visible, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, contentPadding: PaddingValues = PaddingValues(dimensions().spacing0x), checkboxEnabled: Boolean = true, modifier: Modifier = Modifier] but should be [label: String, checked: Boolean, onCheckClicked: ((Boolean) -> Unit), modifier: Modifier = Modifier, maxLine: Int = Int.MAX_VALUE, overflow: TextOverflow = TextOverflow.Visible, horizontalArrangement: Arrangement.Horizontal = Arrangement.Start, contentPadding: PaddingValues = PaddingValues(dimensions().spacing0x), checkboxEnabled: Boolean = true]. See https://slackhq.github.io/compose-lints/rules/#ordering-composable-parameters-properly for more information." + errorLine1="fun WireLabelledCheckbox(" + errorLine2=" ^"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + file="src/main/kotlin/com/wire/android/ui/common/WireLabelledCheckbox.kt" + line="41" + column="25"/> diff --git a/core/ui-common/lint-baseline.xml b/core/ui-common/lint-baseline.xml index 8531a75f935..f3da16328f8 100644 --- a/core/ui-common/lint-baseline.xml +++ b/core/ui-common/lint-baseline.xml @@ -1,5 +1,5 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/features/sketch/lint-baseline.xml b/features/sketch/lint-baseline.xml index a1e24f3a217..98cd24e06c5 100644 --- a/features/sketch/lint-baseline.xml +++ b/features/sketch/lint-baseline.xml @@ -1,26 +1,4 @@ - - - - - - - - - + From df8040c46590980a47c7b7c1d59d9f3f22a954fb Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 21 Oct 2024 15:55:00 +0300 Subject: [PATCH 2/3] feat: Add accessibility strings to conversation details [WPB-9784] (#3495) --- .../devices/register/RegisterDeviceScreen.kt | 2 +- .../devices/remove/RemoveDeviceTopBar.kt | 2 +- .../authentication/welcome/WelcomeScreen.kt | 2 +- .../wire/android/ui/common/AppExtensions.kt | 24 ++++-- .../com/wire/android/ui/common/ArrowIcon.kt | 5 +- .../wire/android/ui/common/MoreOptionIcon.kt | 6 +- .../android/ui/common/UserProfileAvatar.kt | 6 +- .../wire/android/ui/common/WireCheckIcon.kt | 5 +- .../com/wire/android/ui/common/WireSwitch.kt | 15 +++- .../com/wire/android/ui/common/WireTabRow.kt | 5 ++ .../bottomsheet/RichMenuBottomSheetItem.kt | 7 +- .../conversation/HomeSheetContent.kt | 25 +++--- .../conversation/MutingOptionsSheetContent.kt | 16 ++-- .../com/wire/android/ui/debug/DebugScreen.kt | 2 +- .../ui/e2eiEnrollment/E2EIEnrollmentScreen.kt | 2 +- .../ui/home/appLock/set/SetLockCodeScreen.kt | 2 +- .../conversations/ConversationTopAppBar.kt | 2 +- .../details/GroupConversationDetailsScreen.kt | 12 ++- .../CreateGuestLinkBottomSheet.kt | 4 +- .../editguestaccess/EditGuestAccessScreen.kt | 5 +- .../EditSelfDeletingMessagesScreen.kt | 16 +++- .../options/GroupConversationOptions.kt | 83 ++++++++++++++----- .../options/GroupConversationOptionsItem.kt | 16 ++-- .../ConversationParticipantItem.kt | 6 +- .../GroupConversationAllParticipantsScreen.kt | 2 +- .../GroupConversationParticipantList.kt | 7 +- .../media/ConversationMediaScreen.kt | 2 +- .../media/preview/ImagesPreviewScreen.kt | 2 +- .../messagedetails/MessageDetailsScreen.kt | 2 +- .../conversations/messages/QuotedMessage.kt | 5 +- .../home/conversations/model/MessageTypes.kt | 2 + .../location/LocationMessageType.kt | 2 + .../search/SearchUsersAndServicesScreen.kt | 6 +- .../home/conversationslist/common/RowItem.kt | 2 + .../gallery/MediaGalleryScreenTopAppBar.kt | 2 +- .../groupOptions/GroupOptionsScreen.kt | 6 +- .../android/ui/home/settings/SettingsItem.kt | 2 + .../ui/home/settings/SettingsOptionSwitch.kt | 3 +- .../ui/settings/about/AboutThisAppScreen.kt | 2 +- .../e2ei/E2eiCertificateDetailsScreen.kt | 2 +- .../android/ui/sharing/ImportMediaScreen.kt | 8 +- .../other/OtherUserProfileScreen.kt | 10 +-- .../userprofile/self/SelfUserProfileScreen.kt | 2 +- .../android/util/extension/LazyListScope.kt | 3 +- app/src/main/res/values/strings.xml | 18 ++++ .../com/wire/android/model/Clickable.kt | 2 + .../com/wire/android/ui/common/Extensions.kt | 43 ++++++++-- .../common/bottomsheet/MenuBottomSheetItem.kt | 12 ++- .../bottomsheet/ModalSheetHeaderItem.kt | 5 +- .../ui/common/button/WirePrimaryButton.kt | 4 +- .../ui/common/button/WireSecondaryButton.kt | 4 +- .../common/topappbar/NavigationIconButton.kt | 20 +++-- .../topappbar/WireCenterAlignedTopAppBar.kt | 19 +++-- .../feature/sketch/DrawingCanvasScreen.kt | 2 +- 54 files changed, 334 insertions(+), 137 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceScreen.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceScreen.kt index c5d649590fa..16cd474d994 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/register/RegisterDeviceScreen.kt @@ -146,7 +146,7 @@ private fun RegisterDeviceContent( WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, title = stringResource(id = R.string.register_device_title), - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = onBackButtonClicked ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceTopBar.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceTopBar.kt index 5c9a08a7d2f..5456ef8c224 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceTopBar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/devices/remove/RemoveDeviceTopBar.kt @@ -39,7 +39,7 @@ fun RemoveDeviceTopBar(elevation: Dp, onBackButtonClicked: () -> Unit) { WireCenterAlignedTopAppBar( elevation = elevation, title = stringResource(R.string.remove_device_title), - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = onBackButtonClicked ) { Text( diff --git a/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeScreen.kt b/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeScreen.kt index 304b9d06c9b..05b8b90b963 100644 --- a/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/authentication/welcome/WelcomeScreen.kt @@ -135,7 +135,7 @@ private fun WelcomeContent( WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, title = "", - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = navigateBack ) } else { diff --git a/app/src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt b/app/src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt index 25ea3fa6722..a74f1028eaa 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/AppExtensions.kt @@ -18,7 +18,7 @@ package com.wire.android.ui.common -import androidx.compose.foundation.selection.selectable +import android.annotation.SuppressLint import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -29,13 +29,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape import androidx.compose.ui.platform.LocalLifecycleOwner -import androidx.compose.ui.semantics.Role +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.stateDescription import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.flowWithLifecycle import com.google.accompanist.placeholder.PlaceholderHighlight import com.google.accompanist.placeholder.placeholder import com.google.accompanist.placeholder.shimmer +import com.wire.android.R +import com.wire.android.model.Clickable import com.wire.android.ui.home.conversations.model.messagetypes.asset.UIAssetMessage import com.wire.android.ui.theme.wireColorScheme import com.wire.android.ui.theme.wireDimensions @@ -53,13 +57,21 @@ import kotlin.coroutines.EmptyCoroutineContext // todo try to move as much as we can to common +@SuppressLint("ComposeComposableModifier") @Composable -fun Modifier.selectableBackground(isSelected: Boolean, onClick: () -> Unit): Modifier = - this.selectable( - selected = isSelected, +fun Modifier.selectableBackground(isSelected: Boolean, onClick: () -> Unit): Modifier { + val onItemClick = Clickable( + enabled = !isSelected, onClick = onClick, - role = Role.Tab + onClickDescription = stringResource(id = R.string.content_description_select_label) ) + val selectedDescription = stringResource(id = R.string.content_description_selected_label) + + return this + .clickable(onItemClick) + .clickableDescriptions(onItemClick) + .semantics { stateDescription = if (isSelected) selectedDescription else "" } +} @Composable fun Modifier.shimmerPlaceholder( diff --git a/app/src/main/kotlin/com/wire/android/ui/common/ArrowIcon.kt b/app/src/main/kotlin/com/wire/android/ui/common/ArrowIcon.kt index e4aa73c8746..7b0b2ca90ff 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/ArrowIcon.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/ArrowIcon.kt @@ -32,11 +32,12 @@ import com.wire.android.ui.theme.wireDimensions @Composable fun ArrowRightIcon( - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + @StringRes contentDescription: Int = R.string.content_description_right_arrow, ) { ArrowIcon( arrowIcon = R.drawable.ic_arrow_right, - contentDescription = R.string.content_description_right_arrow, + contentDescription = contentDescription, modifier = modifier ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/common/MoreOptionIcon.kt b/app/src/main/kotlin/com/wire/android/ui/common/MoreOptionIcon.kt index 0717b3ddcbf..550b3179160 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/MoreOptionIcon.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/MoreOptionIcon.kt @@ -18,6 +18,7 @@ package com.wire.android.ui.common +import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.wire.android.R @@ -27,13 +28,14 @@ import com.wire.android.ui.common.button.WireSecondaryIconButton @Composable fun MoreOptionIcon( onButtonClicked: () -> Unit, + modifier: Modifier = Modifier, state: WireButtonState = WireButtonState.Default, - modifier: Modifier = Modifier + @StringRes contentDescription: Int = R.string.content_description_show_more_options ) { WireSecondaryIconButton( onButtonClicked = onButtonClicked, iconResource = R.drawable.ic_more, - contentDescription = R.string.content_description_show_more_options, + contentDescription = contentDescription, state = state, modifier = modifier ) diff --git a/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt b/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt index a36ea965fe5..cd8dcf25d38 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/UserProfileAvatar.kt @@ -134,6 +134,7 @@ fun UserProfileAvatar( clickable: Clickable? = null, showPlaceholderIfNoAsset: Boolean = true, withCrossfadeAnimation: Boolean = false, + contentDescription: String? = null, type: UserProfileAvatarType = UserProfileAvatarType.WithIndicators.RegularUser(legalHoldIndicatorVisible = false), ) { Box( @@ -142,6 +143,7 @@ fun UserProfileAvatar( .wrapContentSize() .clip(CircleShape) .clickable(clickable) + .clickableDescriptions(clickable) ) { var userStatusIndicatorParams by remember { mutableStateOf(Size.Zero to Offset.Zero) } Box( @@ -167,6 +169,7 @@ fun UserProfileAvatar( withCrossfadeAnimation = withCrossfadeAnimation, type = type, size = size, + contentDescription = contentDescription, modifier = Modifier .padding(padding) .clip(CircleShape) @@ -224,6 +227,7 @@ private fun UserAvatar( type: UserProfileAvatarType, size: Dp, modifier: Modifier = Modifier, + contentDescription: String? = stringResource(R.string.content_description_user_avatar) ) { if (avatarData.shouldPreferNameBasedAvatar()) { DefaultInitialsAvatar(nameBasedAvatar = avatarData.nameBasedAvatar!!, type = type, size = size, modifier = modifier) @@ -231,7 +235,7 @@ private fun UserAvatar( val painter = painter(avatarData, showPlaceholderIfNoAsset, withCrossfadeAnimation) Image( painter = painter, - contentDescription = stringResource(R.string.content_description_user_avatar), + contentDescription = contentDescription, contentScale = ContentScale.Crop, modifier = modifier, ) diff --git a/app/src/main/kotlin/com/wire/android/ui/common/WireCheckIcon.kt b/app/src/main/kotlin/com/wire/android/ui/common/WireCheckIcon.kt index 5bee223162c..f804d37aeb0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/WireCheckIcon.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/WireCheckIcon.kt @@ -18,6 +18,7 @@ package com.wire.android.ui.common +import androidx.annotation.StringRes import androidx.compose.foundation.layout.size import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme @@ -30,10 +31,10 @@ import com.wire.android.ui.theme.wireColorScheme import com.wire.android.ui.theme.wireDimensions @Composable -fun WireCheckIcon() { +fun WireCheckIcon(@StringRes contentDescription: Int = R.string.content_description_check) { Icon( painter = painterResource(id = R.drawable.ic_check_circle), - contentDescription = stringResource(R.string.content_description_check), + contentDescription = stringResource(contentDescription), modifier = Modifier.size(MaterialTheme.wireDimensions.wireIconButtonSize), tint = MaterialTheme.wireColorScheme.positive ) diff --git a/app/src/main/kotlin/com/wire/android/ui/common/WireSwitch.kt b/app/src/main/kotlin/com/wire/android/ui/common/WireSwitch.kt index 06d394b3ead..d7aed59b7b9 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/WireSwitch.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/WireSwitch.kt @@ -29,6 +29,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.wire.android.ui.theme.wireColorScheme @@ -43,9 +45,18 @@ fun WireSwitch( thumbContent: @Composable () -> Unit = { }, enabled: Boolean = true, interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - colors: SwitchColors = wireSwitchColors() + colors: SwitchColors = wireSwitchColors(), + toggleActionDescription: String? = null ) { - Switch(checked, onCheckedChange, modifier, thumbContent, enabled, colors, interactionSource) + Switch( + checked, + onCheckedChange, + modifier.semantics { toggleActionDescription?.let { onClick(it) { false } } }, + thumbContent, + enabled, + colors, + interactionSource + ) } @Composable diff --git a/app/src/main/kotlin/com/wire/android/ui/common/WireTabRow.kt b/app/src/main/kotlin/com/wire/android/ui/common/WireTabRow.kt index f64ca4a9203..461be78b772 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/WireTabRow.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/WireTabRow.kt @@ -35,6 +35,9 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import com.wire.android.ui.theme.wireColorScheme import com.wire.android.ui.theme.wireTypography @@ -70,8 +73,10 @@ fun WireTabRow( val text = tabItem.title.asString().let { if (upperCaseTitles) it.uppercase() else it } + val selectText = stringResource(id = com.wire.android.R.string.content_description_select_label) Tab( + modifier = Modifier.semantics { onClick(selectText) { false } }, enabled = true, text = { Text( diff --git a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt index d817bd43f51..9e78f99f669 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/RichMenuBottomSheetItem.kt @@ -32,12 +32,14 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview +import com.wire.android.R import com.wire.android.model.Clickable import com.wire.android.ui.common.WireCheckIcon import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.dimensions import com.wire.android.ui.theme.DEFAULT_WEIGHT import com.wire.android.ui.theme.wireColorScheme @@ -63,6 +65,7 @@ fun SelectableMenuBottomSheetItem( .defaultMinSize(minHeight = dimensions().spacing48x) .let { if (isSelectedItem(state)) it.background(MaterialTheme.wireColorScheme.secondaryButtonSelected) else it } .clickable(onItemClick) + .clickableDescriptions(onItemClick) .padding(vertical = dimensions().spacing12x, horizontal = dimensions().spacing16x) ) { icon() @@ -91,7 +94,7 @@ fun SelectableMenuBottomSheetItem( .padding(start = dimensions().spacing8x) .align(Alignment.CenterVertically) ) { - WireCheckIcon() + WireCheckIcon(R.string.label_selected) } } } diff --git a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/HomeSheetContent.kt b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/HomeSheetContent.kt index 05f6bb05776..12695e96b22 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/HomeSheetContent.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/HomeSheetContent.kt @@ -99,11 +99,12 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_mute, - contentDescription = stringResource(R.string.content_description_muted_conversation), + contentDescription = null, ) }, action = { NotificationsOptionsItemAction(conversationSheetContent.mutingConversationState) }, - onItemClick = navigateToNotification + onItemClick = navigateToNotification, + onItemClickDescription = stringResource(id = R.string.content_description_open_notification_settings_label) ) } } @@ -139,10 +140,7 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_archive, - contentDescription = stringResource( - if (conversationSheetContent.isArchived) R.string.content_description_unarchive - else R.string.content_description_move_to_archive - ), + contentDescription = null, ) }, title = stringResource( @@ -161,14 +159,15 @@ internal fun ConversationMainSheetContent( ) ) } - }) + } + ) } add { MenuBottomSheetItem( icon = { MenuItemIcon( id = R.drawable.ic_erase, - contentDescription = stringResource(R.string.content_description_clear_content), + contentDescription = null, ) }, title = stringResource(R.string.label_clear_content), @@ -191,7 +190,7 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_block, - contentDescription = stringResource(R.string.content_description_block_the_user), + contentDescription = null, ) }, itemProvidedColor = MaterialTheme.colorScheme.error, @@ -214,7 +213,7 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_block, - contentDescription = stringResource(R.string.content_description_unblock_the_user) + contentDescription = null ) }, itemProvidedColor = MaterialTheme.colorScheme.onBackground, @@ -236,7 +235,7 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_leave, - contentDescription = stringResource(R.string.content_description_leave_the_group), + contentDescription = null, ) }, itemProvidedColor = MaterialTheme.colorScheme.error, @@ -258,7 +257,7 @@ internal fun ConversationMainSheetContent( icon = { MenuItemIcon( id = R.drawable.ic_remove, - contentDescription = stringResource(R.string.content_description_delete_the_group), + contentDescription = null, ) }, title = stringResource(R.string.label_delete_group), @@ -293,6 +292,6 @@ fun NotificationsOptionsItemAction( modifier = Modifier.weight(weight = 1f, fill = false) ) Spacer(modifier = Modifier.size(dimensions().spacing16x)) - ArrowRightIcon() + ArrowRightIcon(contentDescription = R.string.content_description_empty) } } diff --git a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/MutingOptionsSheetContent.kt b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/MutingOptionsSheetContent.kt index 6c07ffead89..bafff78b1b0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/MutingOptionsSheetContent.kt +++ b/app/src/main/kotlin/com/wire/android/ui/common/bottomsheet/conversation/MutingOptionsSheetContent.kt @@ -25,10 +25,10 @@ import androidx.compose.ui.res.stringResource import com.wire.android.R import com.wire.android.model.Clickable import com.wire.android.ui.common.ArrowLeftIcon -import com.wire.android.ui.common.bottomsheet.WireMenuModalSheetContent import com.wire.android.ui.common.bottomsheet.MenuModalSheetHeader -import com.wire.android.ui.common.bottomsheet.SelectableMenuBottomSheetItem import com.wire.android.ui.common.bottomsheet.RichMenuItemState +import com.wire.android.ui.common.bottomsheet.SelectableMenuBottomSheetItem +import com.wire.android.ui.common.bottomsheet.WireMenuModalSheetContent import com.wire.android.ui.common.dimensions import com.wire.kalium.logic.data.conversation.MutedConversationStatus @@ -51,7 +51,9 @@ internal fun MutingOptionsSheetContent( SelectableMenuBottomSheetItem( title = stringResource(id = R.string.muting_option_all_allowed_title), subLine = stringResource(id = R.string.muting_option_all_allowed_text), - onItemClick = Clickable { onMuteConversation(MutedConversationStatus.AllAllowed) }, + onItemClick = Clickable(onClickDescription = stringResource(id = R.string.content_description_select_label)) { + onMuteConversation(MutedConversationStatus.AllAllowed) + }, state = if (mutingConversationState == MutedConversationStatus.AllAllowed) RichMenuItemState.SELECTED else RichMenuItemState.DEFAULT ) @@ -60,7 +62,9 @@ internal fun MutingOptionsSheetContent( SelectableMenuBottomSheetItem( title = stringResource(id = R.string.muting_option_only_mentions_title), subLine = stringResource(id = R.string.muting_option_only_mentions_text), - onItemClick = Clickable { onMuteConversation(MutedConversationStatus.OnlyMentionsAndRepliesAllowed) }, + onItemClick = Clickable(onClickDescription = stringResource(id = R.string.content_description_select_label)) { + onMuteConversation(MutedConversationStatus.OnlyMentionsAndRepliesAllowed) + }, state = if (mutingConversationState == MutedConversationStatus.OnlyMentionsAndRepliesAllowed) RichMenuItemState.SELECTED else RichMenuItemState.DEFAULT ) @@ -69,7 +73,9 @@ internal fun MutingOptionsSheetContent( SelectableMenuBottomSheetItem( title = stringResource(id = R.string.muting_option_all_muted_title), subLine = stringResource(id = R.string.muting_option_all_muted_text), - onItemClick = Clickable { onMuteConversation(MutedConversationStatus.AllMuted) }, + onItemClick = Clickable(onClickDescription = stringResource(id = R.string.content_description_select_label)) { + onMuteConversation(MutedConversationStatus.AllMuted) + }, state = if (mutingConversationState == MutedConversationStatus.AllMuted) RichMenuItemState.SELECTED else RichMenuItemState.DEFAULT ) diff --git a/app/src/main/kotlin/com/wire/android/ui/debug/DebugScreen.kt b/app/src/main/kotlin/com/wire/android/ui/debug/DebugScreen.kt index 9fe5c0c07a3..e1d8f67a671 100644 --- a/app/src/main/kotlin/com/wire/android/ui/debug/DebugScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/debug/DebugScreen.kt @@ -92,7 +92,7 @@ internal fun UserDebugContent( WireCenterAlignedTopAppBar( title = stringResource(R.string.label_debug_title), elevation = dimensions().spacing0x, - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), onNavigationPressed = onNavigationPressed ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt b/app/src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt index 09235816b2e..d00c112ab4a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/e2eiEnrollment/E2EIEnrollmentScreen.kt @@ -138,7 +138,7 @@ private fun E2EIEnrollmentScreenContent( WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, title = stringResource(id = R.string.end_to_end_identity_required_dialog_title), - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = onBackButtonClicked ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockCodeScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockCodeScreen.kt index f67a808ea67..95dfdd4f7c3 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockCodeScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/appLock/set/SetLockCodeScreen.kt @@ -115,7 +115,7 @@ fun SetLockCodeScreenContent( topBar = { WireCenterAlignedTopAppBar( onNavigationPressed = onBackPress, - navigationIconType = if (state.isEditable) NavigationIconType.Back else null, + navigationIconType = if (state.isEditable) NavigationIconType.Back() else null, elevation = dimensions().spacing0x, title = stringResource(id = R.string.settings_set_lock_screen_title) ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationTopAppBar.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationTopAppBar.kt index f6d92a9ce44..dc6c011668d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationTopAppBar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/ConversationTopAppBar.kt @@ -154,7 +154,7 @@ private fun ConversationScreenTopAppBarContent( } }, navigationIcon = { - NavigationIconButton(NavigationIconType.Back, onBackButtonClick) + NavigationIconButton(NavigationIconType.Back(), onBackButtonClick) }, actions = { Row( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt index 97c4169a94f..d1634891bb2 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt @@ -337,13 +337,19 @@ private fun GroupConversationDetailsContent( WireTopAppBarTitle( title = stringResource(R.string.conversation_details_title), style = MaterialTheme.wireTypography.title01, - maxLines = 2 + maxLines = 2, + contentDescription = stringResource(id = R.string.content_description_conversation_details_header) ) VerificationInfo(conversationSheetContent) }, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(R.string.content_description_conversation_details_close_btn), onNavigationPressed = onBackPressed, - actions = { MoreOptionIcon(onButtonClicked = sheetState::show) } + actions = { + MoreOptionIcon( + contentDescription = R.string.content_description_conversation_details_more_btn, + onButtonClicked = sheetState::show + ) + } ) }, topBarCollapsing = { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/CreateGuestLinkBottomSheet.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/CreateGuestLinkBottomSheet.kt index d53c8df9843..8935747d2a5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/CreateGuestLinkBottomSheet.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/CreateGuestLinkBottomSheet.kt @@ -69,9 +69,7 @@ private fun CreateInviteLinkSheetItem( MenuBottomSheetItem( title = title, onItemClick = onClicked, - action = { - ArrowRightIcon() - }, + action = { ArrowRightIcon(contentDescription = R.string.content_description_empty) }, enabled = enabled ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessScreen.kt index a9154ecdcf6..31f7a44653e 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editguestaccess/EditGuestAccessScreen.kt @@ -51,6 +51,7 @@ import com.wire.android.ui.common.dimensions import com.wire.android.ui.common.rememberTopBarElevationState import com.wire.android.ui.common.scaffold.WireScaffold import com.wire.android.ui.common.snackbar.LocalSnackbarHostState +import com.wire.android.ui.common.topappbar.NavigationIconType import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar import com.wire.android.ui.destinations.CreatePasswordProtectedGuestLinkScreenDestination import com.wire.android.ui.home.conversations.details.editguestaccess.createPasswordProtectedGuestLink.CreatePasswordGuestLinkNavArgs @@ -103,8 +104,10 @@ fun EditGuestAccessScreen( topBar = { WireCenterAlignedTopAppBar( elevation = scrollState.rememberTopBarElevationState().value, + navigationIconType = NavigationIconType.Back(R.string.content_description_edit_guests_option_back_btn), onNavigationPressed = navigator::navigateBack, - title = stringResource(id = R.string.conversation_options_guests_label) + title = stringResource(id = R.string.conversation_options_guests_label), + titleContentDescription = stringResource(id = R.string.content_description_edit_guests_option_title) ) } ) { internalPadding -> diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt index 9909919d9cb..e83ce0ce926 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/editselfdeletingmessages/EditSelfDeletingMessagesScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource @@ -50,6 +51,7 @@ import com.wire.android.ui.common.rememberTopBarElevationState import com.wire.android.ui.common.scaffold.WireScaffold import com.wire.android.ui.common.selectableBackground import com.wire.android.ui.common.spacers.HorizontalSpace +import com.wire.android.ui.common.topappbar.NavigationIconType import com.wire.android.ui.common.topappbar.WireCenterAlignedTopAppBar import com.wire.android.ui.home.messagecomposer.SelfDeletionDuration import com.wire.android.ui.theme.wireColorScheme @@ -74,9 +76,12 @@ fun EditSelfDeletingMessagesScreen( WireCenterAlignedTopAppBar( elevation = scrollState.rememberTopBarElevationState().value, onNavigationPressed = navigator::navigateBack, - title = stringResource(id = R.string.self_deleting_messages_title) + title = stringResource(id = R.string.self_deleting_messages_title), + titleContentDescription = stringResource(id = R.string.content_description_edit_self_delete_title), + navigationIconType = NavigationIconType.Back(R.string.content_description_edit_self_delete_back_btn) ) - }) { internalPadding -> + } + ) { internalPadding -> with(editSelfDeletingMessagesViewModel) { Column(modifier = Modifier.padding(internalPadding)) { SelfDeletingMessageOption( @@ -148,6 +153,7 @@ fun SelectableSelfDeletingItem( RadioButton(selected = isSelected, onClick = null) HorizontalSpace.x8() Text( + modifier = Modifier.align(Alignment.CenterVertically), text = duration.longLabel.asString(), style = MaterialTheme.wireTypography.body01, color = MaterialTheme.wireColorScheme.onBackground @@ -160,3 +166,9 @@ fun SelectableSelfDeletingItem( fun PreviewEditSelfDeletingMessagesScreen() { EditSelfDeletingMessagesScreen(rememberNavigator {}) } + +@Preview +@Composable +fun PreviewSelectableSelfDeletingItem() { + SelectableSelfDeletingItem(SelfDeletionDuration.FiveMinutes, true) { _ -> } +} diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt index c2d9bfaf8df..d6364f9bc65 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptions.kt @@ -53,6 +53,8 @@ import com.wire.android.util.ui.PreviewMultipleThemes import com.wire.android.util.ui.UIText import com.wire.kalium.logic.data.conversation.Conversation import com.wire.kalium.logic.data.id.ConversationId +import com.wire.kalium.logic.data.message.SelfDeletionTimer +import kotlin.time.Duration.Companion.days @Composable fun GroupConversationOptions( @@ -113,7 +115,11 @@ fun GroupConversationSettings( subtitle = stringResource(id = R.string.conversation_details_guest_description), switchState = SwitchState.TextOnly(value = state.isGuestAllowed), arrowType = if (state.isUpdatingGuestAllowed) ArrowType.TITLE_ALIGNED else ArrowType.NONE, - clickable = Clickable(enabled = state.isUpdatingGuestAllowed, onClick = onGuestItemClicked, onLongClick = {}), + clickable = Clickable( + enabled = state.isUpdatingGuestAllowed, + onClick = onGuestItemClicked, + onClickDescription = stringResource(id = R.string.content_description_conversation_details_guests_action) + ), ) } @@ -129,6 +135,7 @@ fun GroupConversationSettings( } } item { FolderHeader(name = stringResource(id = R.string.folder_label_messaging)) } + if (!state.selfDeletionTimer.isDisabled) { item { GroupConversationOptionsItem( @@ -148,8 +155,8 @@ fun GroupConversationSettings( clickable = Clickable( enabled = state.isUpdatingSelfDeletingAllowed && !state.selfDeletionTimer.isEnforcedByTeam, onClick = onSelfDeletingClicked, - onLongClick = {} - ), + onClickDescription = stringResource(id = R.string.content_description_conversation_details_self_deleting_action) + ) ) } } @@ -219,8 +226,9 @@ private fun GroupNameItem( clickable = Clickable( enabled = canBeChanged, onClick = onClick, - onLongClick = { /* not handled */ }), - arrowType = if (!canBeChanged) ArrowType.NONE else ArrowType.CENTER_ALIGNED + onClickDescription = stringResource(id = R.string.content_description_edit_label) + ), + arrowType = if (!canBeChanged) ArrowType.NONE else ArrowType.CENTER_ALIGNED, ) HorizontalDivider(thickness = Dp.Hairline, color = MaterialTheme.wireColorScheme.divider) } @@ -279,7 +287,7 @@ fun GroupOptionWithSwitch( isLoading: Boolean, onClick: (Boolean) -> Unit, @StringRes title: Int, - @StringRes subTitle: Int? + @StringRes subTitle: Int?, ) { GroupConversationOptionsItem( title = stringResource(id = title), @@ -327,7 +335,7 @@ fun DisableConformationDialog(@StringRes title: Int, @StringRes text: Int, onCon @Composable fun PreviewAdminTeamGroupConversationOptions() = WireTheme { GroupConversationSettings( - GroupConversationOptionsState( + state = GroupConversationOptionsState( conversationId = ConversationId("someValue", "someDomain"), groupName = "Team Group Conversation", areAccessOptionsAvailable = true, @@ -341,11 +349,11 @@ fun PreviewAdminTeamGroupConversationOptions() = WireTheme { isReadReceiptAllowed = true, mlsEnabled = true ), - {}, - {}, - {}, - {}, - {} + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, ) } @@ -353,7 +361,7 @@ fun PreviewAdminTeamGroupConversationOptions() = WireTheme { @Composable fun PreviewGuestAdminTeamGroupConversationOptions() = WireTheme { GroupConversationSettings( - GroupConversationOptionsState( + state = GroupConversationOptionsState( conversationId = ConversationId("someValue", "someDomain"), groupName = "Team Group Conversation", areAccessOptionsAvailable = true, @@ -366,7 +374,11 @@ fun PreviewGuestAdminTeamGroupConversationOptions() = WireTheme { isServicesAllowed = true, isReadReceiptAllowed = true, ), - {}, {}, {}, {}, {} + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, ) } @@ -374,7 +386,7 @@ fun PreviewGuestAdminTeamGroupConversationOptions() = WireTheme { @Composable fun PreviewExternalMemberAdminTeamGroupConversationOptions() = WireTheme { GroupConversationSettings( - GroupConversationOptionsState( + state = GroupConversationOptionsState( conversationId = ConversationId("someValue", "someDomain"), groupName = "Team Group Conversation", areAccessOptionsAvailable = true, @@ -387,7 +399,11 @@ fun PreviewExternalMemberAdminTeamGroupConversationOptions() = WireTheme { isServicesAllowed = true, isReadReceiptAllowed = true, ), - {}, {}, {}, {}, {} + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, ) } @@ -395,7 +411,7 @@ fun PreviewExternalMemberAdminTeamGroupConversationOptions() = WireTheme { @Composable fun PreviewMemberTeamGroupConversationOptions() = WireTheme { GroupConversationSettings( - GroupConversationOptionsState( + state = GroupConversationOptionsState( conversationId = ConversationId("someValue", "someDomain"), groupName = "Normal Group Conversation", areAccessOptionsAvailable = true, @@ -408,7 +424,11 @@ fun PreviewMemberTeamGroupConversationOptions() = WireTheme { isServicesAllowed = true, isReadReceiptAllowed = true, ), - {}, {}, {}, {}, {} + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, ) } @@ -416,11 +436,34 @@ fun PreviewMemberTeamGroupConversationOptions() = WireTheme { @Composable fun PreviewNormalGroupConversationOptions() = WireTheme { GroupConversationSettings( - GroupConversationOptionsState( + state = GroupConversationOptionsState( conversationId = ConversationId("someValue", "someDomain"), groupName = "Normal Group Conversation", areAccessOptionsAvailable = false ), - {}, {}, {}, {}, {} + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, + ) +} + +@PreviewMultipleThemes +@Composable +fun PreviewNormalGroupConversationOptionsWithSelfDelet() = WireTheme { + GroupConversationSettings( + state = GroupConversationOptionsState( + conversationId = ConversationId("someValue", "someDomain"), + groupName = "Normal Group Conversation", + areAccessOptionsAvailable = false, + selfDeletionTimer = SelfDeletionTimer.Enabled(3.days), + isUpdatingSelfDeletingAllowed = true + ), + onGuestItemClicked = {}, + onSelfDeletingClicked = {}, + onServiceSwitchClicked = {}, + onReadReceiptSwitchClicked = {}, + onEditGroupName = {}, ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptionsItem.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptionsItem.kt index 8cd3137eec6..7a39282235a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptionsItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/options/GroupConversationOptionsItem.kt @@ -34,13 +34,17 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextStyle import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import com.wire.android.R import com.wire.android.model.Clickable import com.wire.android.ui.common.ArrowRightIcon import com.wire.android.ui.common.button.WireSecondaryButton import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.home.settings.SettingsOptionSwitch import com.wire.android.ui.home.settings.SwitchState import com.wire.android.ui.theme.wireColorScheme @@ -50,12 +54,11 @@ import com.wire.android.ui.theme.wireTypography @Composable fun GroupConversationOptionsItem( title: String, - clickable: Clickable = Clickable(enabled = false, onClick = { /* not handled */ }, onLongClick = { /* not handled */ }), modifier: Modifier = Modifier .fillMaxWidth() .background(MaterialTheme.wireColorScheme.surface) - .clickable(clickable) .defaultMinSize(minHeight = MaterialTheme.wireDimensions.conversationOptionsItemMinHeight), + clickable: Clickable = Clickable(enabled = false, onClick = { /* not handled */ }), subtitle: String? = null, label: String? = null, trailingOnText: String? = null, @@ -64,10 +67,14 @@ fun GroupConversationOptionsItem( switchState: SwitchState = SwitchState.None, titleStyle: TextStyle = MaterialTheme.wireTypography.body02, arrowType: ArrowType = ArrowType.CENTER_ALIGNED, + contentDescription: String? = null ) { Row( verticalAlignment = Alignment.CenterVertically, modifier = modifier + .clickable(clickable) + .clickableDescriptions(clickable) + .semantics { contentDescription?.let { this.contentDescription = contentDescription } } .padding( top = MaterialTheme.wireDimensions.spacing12x, bottom = MaterialTheme.wireDimensions.spacing12x, @@ -76,8 +83,7 @@ fun GroupConversationOptionsItem( ) ) { Column( - modifier = Modifier - .weight(1f) + modifier = Modifier.weight(1f) ) { if (label != null) { Text( @@ -126,7 +132,7 @@ private fun ArrowRight() { start = MaterialTheme.wireDimensions.spacing8x, end = MaterialTheme.wireDimensions.spacing8x ) - ) { ArrowRightIcon() } + ) { ArrowRightIcon(contentDescription = R.string.content_description_empty) } } enum class ArrowType { diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/ConversationParticipantItem.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/ConversationParticipantItem.kt index cd8f9af6d87..846eedf887a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/ConversationParticipantItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/ConversationParticipantItem.kt @@ -76,6 +76,7 @@ fun ConversationParticipantItem( modifier = Modifier.padding( start = dimensions().spacing8x ), + contentDescription = null, type = uiParticipant.expiresAt?.let { WithIndicators.TemporaryUser(it) } ?: WithIndicators.RegularUser() ) }, @@ -136,7 +137,10 @@ fun ConversationParticipantItem( .wrapContentWidth() .padding(end = MaterialTheme.wireDimensions.spacing8x) ) { - ArrowRightIcon(Modifier.align(Alignment.TopEnd)) + ArrowRightIcon( + modifier = Modifier.align(Alignment.TopEnd), + contentDescription = R.string.content_description_empty + ) } } }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationAllParticipantsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationAllParticipantsScreen.kt index 8365ea4bf79..5a86be9e0dd 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationAllParticipantsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationAllParticipantsScreen.kt @@ -85,7 +85,7 @@ private fun GroupConversationAllParticipantsContent( WireCenterAlignedTopAppBar( elevation = lazyListState.rememberTopBarElevationState().value, title = stringResource(R.string.conversation_details_group_participants_title), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), onNavigationPressed = onBackPressed ) { // TODO add search bar diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationParticipantList.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationParticipantList.kt index 82653621e8c..5670e60929c 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationParticipantList.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/participants/GroupConversationParticipantList.kt @@ -21,6 +21,7 @@ package com.wire.android.ui.home.conversations.details.participants import android.content.Context import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.runtime.remember +import androidx.compose.ui.res.stringResource import com.wire.android.R import com.wire.android.model.Clickable import com.wire.android.ui.common.divider.WireDivider @@ -54,9 +55,10 @@ fun LazyListScope.folderWithElements( items = items.associateBy { it.id.toString() }, animateItemPlacement = false, factory = { + val onClickDescription = stringResource(id = R.string.content_description_open_user_profile_label) ConversationParticipantItem( uiParticipant = it, - clickable = remember { Clickable(enabled = true) { onRowItemClicked(it) } }, + clickable = remember { Clickable(enabled = true, onClickDescription = onClickDescription) { onRowItemClicked(it) } }, showRightArrow = showRightArrow ) }, @@ -73,9 +75,10 @@ fun LazyListScope.folderWithElements( items = items, animateItemPlacement = false, factory = { + val onClickDescription = stringResource(id = R.string.content_description_open_user_profile_label) ConversationParticipantItem( uiParticipant = it, - clickable = remember { Clickable(enabled = true) { onRowItemClicked(it) } }, + clickable = remember { Clickable(enabled = true, onClickDescription = onClickDescription) { onRowItemClicked(it) } }, showRightArrow = showRightArrow ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt index 4be35628394..3b1b37b8c1a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/ConversationMediaScreen.kt @@ -193,7 +193,7 @@ private fun Content( WireCenterAlignedTopAppBar( elevation = elevationState, title = stringResource(id = R.string.label_conversation_media), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), onNavigationPressed = onNavigationPressed, bottomContent = { WireTabRow( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/preview/ImagesPreviewScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/preview/ImagesPreviewScreen.kt index bcda40e083d..b6a1784edda 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/preview/ImagesPreviewScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/media/preview/ImagesPreviewScreen.kt @@ -145,7 +145,7 @@ private fun Content( topBar = { WireCenterAlignedTopAppBar( title = previewState.conversationName, - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), onNavigationPressed = onNavigationPressed, ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsScreen.kt index 7056604c256..ee1249089b0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messagedetails/MessageDetailsScreen.kt @@ -129,7 +129,7 @@ private fun MessageDetailsScreenContent( WireCenterAlignedTopAppBar( elevation = elevationState, title = stringResource(R.string.message_details_title), - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = onBackPressed ) { WireTabRow( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt index 308b57ea5c2..dd6d96f1358 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/messages/QuotedMessage.kt @@ -57,6 +57,7 @@ import com.wire.android.model.Clickable import com.wire.android.model.ImageAsset import com.wire.android.ui.common.StatusBox import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.colorsScheme import com.wire.android.ui.common.dimensions import com.wire.android.ui.common.typography @@ -226,7 +227,7 @@ private fun QuotedMessageContent( .fillMaxWidth() .height(IntrinsicSize.Min) .let { - if (clickable != null) it.clickable(clickable) else it + if (clickable != null) it.clickable(clickable).clickableDescriptions(clickable) else it } ) { Box(modifier = Modifier.padding(start = dimensions().spacing4x)) { @@ -449,7 +450,7 @@ private fun AutosizeContainer( .fillMaxWidth() .padding(dimensions().spacing8x) .let { - if (clickable != null) it.clickable(clickable) else it + if (clickable != null) it.clickable(clickable).clickableDescriptions(clickable) else it } ) { val (leftSide, rightSide) = createRefs() diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt index e7ea4861962..4e5baac9e9f 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/MessageTypes.kt @@ -44,6 +44,7 @@ import com.wire.android.model.ImageAsset import com.wire.android.ui.common.button.WireButtonState import com.wire.android.ui.common.button.WireSecondaryButton import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.dimensions import com.wire.android.ui.home.conversations.CompositeMessageViewModel import com.wire.android.ui.home.conversations.CompositeMessageViewModelImpl @@ -247,6 +248,7 @@ fun MediaAssetImage( ) .wrapContentSize() .clickable(onImageClick) + .clickableDescriptions(onImageClick) ) { when { // Trying to upload the asset diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/location/LocationMessageType.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/location/LocationMessageType.kt index cc0a672699c..c58738d15c0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/location/LocationMessageType.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/model/messagetypes/location/LocationMessageType.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.unit.sp import com.wire.android.R import com.wire.android.model.Clickable import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.dimensions import com.wire.android.ui.theme.wireColorScheme import com.wire.android.ui.theme.wireDimensions @@ -61,6 +62,7 @@ fun LocationMessageContent( Column( modifier = Modifier .clickable(onLocationClick) + .clickableDescriptions(onLocationClick) .padding(top = dimensions().spacing4x) .clip(shape = RoundedCornerShape(dimensions().messageAssetBorderRadius)) .border( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/SearchUsersAndServicesScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/SearchUsersAndServicesScreen.kt index f4e2e3b3746..e78efd42179 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/SearchUsersAndServicesScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/search/SearchUsersAndServicesScreen.kt @@ -114,9 +114,9 @@ fun SearchUsersAndServicesScreen( elevation = dimensions().spacing0x, // CollapsingTopBarScaffold already manages elevation title = searchTitle, navigationIconType = when (screenType) { - SearchPeopleScreenType.CONVERSATION_DETAILS -> NavigationIconType.Close - SearchPeopleScreenType.NEW_CONVERSATION -> NavigationIconType.Close - SearchPeopleScreenType.NEW_GROUP_CONVERSATION -> NavigationIconType.Back + SearchPeopleScreenType.CONVERSATION_DETAILS -> NavigationIconType.Close() + SearchPeopleScreenType.NEW_CONVERSATION -> NavigationIconType.Close() + SearchPeopleScreenType.NEW_GROUP_CONVERSATION -> NavigationIconType.Back() }, onNavigationPressed = onClose ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/common/RowItem.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/common/RowItem.kt index f5ad8749c5d..626ef5f8ca0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/common/RowItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversationslist/common/RowItem.kt @@ -30,6 +30,7 @@ import androidx.compose.ui.Modifier import com.wire.android.model.Clickable import com.wire.android.ui.common.SurfaceBackgroundWrapper import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.theme.wireDimensions @Composable @@ -46,6 +47,7 @@ fun RowItem( verticalAlignment = Alignment.CenterVertically, modifier = Modifier .clickable(clickable) + .clickableDescriptions(clickable) .then( modifier .defaultMinSize(minHeight = MaterialTheme.wireDimensions.conversationItemRowHeight) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreenTopAppBar.kt b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreenTopAppBar.kt index 3f98135a29e..7d8483eb96d 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreenTopAppBar.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/gallery/MediaGalleryScreenTopAppBar.kt @@ -34,7 +34,7 @@ fun MediaGalleryScreenTopAppBar( WireCenterAlignedTopAppBar( onNavigationPressed = onCloseClick, title = title, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), elevation = 0.dp, actions = { WireSecondaryIconButton( diff --git a/app/src/main/kotlin/com/wire/android/ui/home/newconversation/groupOptions/GroupOptionsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/newconversation/groupOptions/GroupOptionsScreen.kt index 1755ccdfc0e..c15e2200ba0 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/newconversation/groupOptions/GroupOptionsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/newconversation/groupOptions/GroupOptionsScreen.kt @@ -172,7 +172,7 @@ private fun GroupOptionState.ReadReceiptsOptions(onReadReceiptChanged: (Boolean) isOnOffVisible = false, onCheckedChange = { onReadReceiptChanged.invoke(it) }), arrowType = ArrowType.NONE, - clickable = Clickable(enabled = false, onClick = {}, onLongClick = {}), + clickable = Clickable(enabled = false, onClick = {}), modifier = Modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.surface) @@ -198,7 +198,7 @@ private fun GroupOptionState.AllowServicesOptions(onAllowServicesChanged: (Boole isOnOffVisible = false, onCheckedChange = { onAllowServicesChanged.invoke(it) }), arrowType = ArrowType.NONE, - clickable = Clickable(enabled = false, onClick = {}, onLongClick = {}), + clickable = Clickable(enabled = false, onClick = {}), modifier = Modifier .fillMaxWidth() .background(MaterialTheme.colorScheme.surface) @@ -222,7 +222,7 @@ private fun GroupOptionState.AllowGuestsOptions(onAllowGuestChanged: (Boolean) - isOnOffVisible = false, onCheckedChange = { onAllowGuestChanged.invoke(it) }), arrowType = ArrowType.NONE, - clickable = Clickable(enabled = false, onClick = {}, onLongClick = {}), + clickable = Clickable(enabled = false, onClick = {}), modifier = Modifier.background(MaterialTheme.colorScheme.surface) ) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt index 2aaead37c90..2ba3eb27ca5 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsItem.kt @@ -40,6 +40,7 @@ import com.wire.android.navigation.TermsOfUseScreenDestination import com.wire.android.navigation.WireWebsiteScreenDestination import com.wire.android.ui.common.RowItemTemplate import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.dimensions import com.wire.android.ui.destinations.AboutThisAppScreenDestination import com.wire.android.ui.destinations.AppSettingsScreenDestination @@ -95,6 +96,7 @@ fun SettingsItem( .defaultMinSize(dimensions().wireIconButtonSize) .padding(end = dimensions().spacing8x) .clickable(onIconPressed) + .clickableDescriptions(onIconPressed) ) } ?: Icons.Filled.ChevronRight }, diff --git a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsOptionSwitch.kt b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsOptionSwitch.kt index db02c38da47..a68341f14ac 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsOptionSwitch.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/settings/SettingsOptionSwitch.kt @@ -57,7 +57,8 @@ fun SettingsOptionSwitch( WireSwitch( checked = switchState.value, enabled = switchState is SwitchState.Enabled, - onCheckedChange = (switchState as? SwitchState.Enabled)?.onCheckedChange + onCheckedChange = (switchState as? SwitchState.Enabled)?.onCheckedChange, + toggleActionDescription = stringResource(id = R.string.content_description_toggle_setting_label) ) } } diff --git a/app/src/main/kotlin/com/wire/android/ui/settings/about/AboutThisAppScreen.kt b/app/src/main/kotlin/com/wire/android/ui/settings/about/AboutThisAppScreen.kt index cd24240be1c..3dc6eeccbae 100644 --- a/app/src/main/kotlin/com/wire/android/ui/settings/about/AboutThisAppScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/settings/about/AboutThisAppScreen.kt @@ -84,7 +84,7 @@ private fun AboutThisAppContent( WireCenterAlignedTopAppBar( title = stringResource(id = R.string.about_app_screen_title), elevation = dimensions().spacing0x, - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), onNavigationPressed = onBackPressed ) } diff --git a/app/src/main/kotlin/com/wire/android/ui/settings/devices/e2ei/E2eiCertificateDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/settings/devices/e2ei/E2eiCertificateDetailsScreen.kt index 436426334ae..4e816e2e029 100644 --- a/app/src/main/kotlin/com/wire/android/ui/settings/devices/e2ei/E2eiCertificateDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/settings/devices/e2ei/E2eiCertificateDetailsScreen.kt @@ -75,7 +75,7 @@ fun E2eiCertificateDetailsScreen( WireCenterAlignedTopAppBar( onNavigationPressed = navigator::navigateBack, title = stringResource(R.string.e2ei_certificate_details_screen_title), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), actions = { WireSecondaryIconButton( onButtonClicked = sheetState::show, diff --git a/app/src/main/kotlin/com/wire/android/ui/sharing/ImportMediaScreen.kt b/app/src/main/kotlin/com/wire/android/ui/sharing/ImportMediaScreen.kt index 7ebff3e1b4d..93a6e3089ad 100644 --- a/app/src/main/kotlin/com/wire/android/ui/sharing/ImportMediaScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/sharing/ImportMediaScreen.kt @@ -161,7 +161,7 @@ private fun ImportMediaLoadingContent(navigateBack: () -> Unit) { WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, onNavigationPressed = navigateBack, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), title = stringResource(id = R.string.import_media_content_title), ) }, @@ -262,7 +262,7 @@ fun ImportMediaRestrictedContent( WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, onNavigationPressed = navigateBack, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), title = stringResource(id = R.string.import_media_content_title), actions = { UserProfileAvatar( @@ -308,7 +308,7 @@ fun ImportMediaRegularContent( WireCenterAlignedTopAppBar( elevation = lazyListState.topBarElevation(maxAppBarElevation), onNavigationPressed = navigateBack, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), title = stringResource(id = R.string.import_media_content_title), actions = { UserProfileAvatar( @@ -379,7 +379,7 @@ fun ImportMediaLoggedOutContent( WireCenterAlignedTopAppBar( elevation = dimensions().spacing0x, onNavigationPressed = navigateBack, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), title = stringResource(id = R.string.import_media_content_title), ) }, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt index 40b5900e539..1c84f02bb15 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/other/OtherUserProfileScreen.kt @@ -193,7 +193,7 @@ fun OtherUserProfileScreen( }, onSearchConversationMessagesClick = onSearchConversationMessagesClick, navigateBack = navigator::navigateBack, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onConversationMediaClick = onConversationMediaClick, onLegalHoldLearnMoreClick = remember { { legalHoldSubjectDialogState.show(Unit) } }, ) @@ -610,7 +610,7 @@ fun PreviewOtherProfileScreenGroupMemberContent() { connectionState = ConnectionState.ACCEPTED, isUnderLegalHold = true, ), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), requestInProgress = false, sheetState = rememberWireModalSheetState(), openBottomSheet = {}, @@ -634,7 +634,7 @@ fun PreviewOtherProfileScreenContent() { isUnderLegalHold = true, groupState = null ), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), requestInProgress = false, sheetState = rememberWireModalSheetState(), openBottomSheet = {}, @@ -657,7 +657,7 @@ fun PreviewOtherProfileScreenContentNotConnected() { connectionState = ConnectionState.CANCELLED, isUnderLegalHold = true, ), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), requestInProgress = false, sheetState = rememberWireModalSheetState(), openBottomSheet = {}, @@ -682,7 +682,7 @@ fun PreviewOtherProfileScreenTempUser() { isUnderLegalHold = true, expiresAt = Instant.DISTANT_FUTURE ), - navigationIconType = NavigationIconType.Back, + navigationIconType = NavigationIconType.Back(), requestInProgress = false, sheetState = rememberWireModalSheetState(), openBottomSheet = {}, diff --git a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt index 16c3ed064c8..449c59e2b59 100644 --- a/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/userprofile/self/SelfUserProfileScreen.kt @@ -329,7 +329,7 @@ private fun SelfUserProfileTopBar( WireCenterAlignedTopAppBar( onNavigationPressed = onCloseClick, title = stringResource(id = R.string.user_profile_title), - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), elevation = 0.dp, actions = { WireSecondaryButton( diff --git a/app/src/main/kotlin/com/wire/android/util/extension/LazyListScope.kt b/app/src/main/kotlin/com/wire/android/util/extension/LazyListScope.kt index 4fe3adfb8c1..1131a6b75d6 100644 --- a/app/src/main/kotlin/com/wire/android/util/extension/LazyListScope.kt +++ b/app/src/main/kotlin/com/wire/android/util/extension/LazyListScope.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.Modifier import com.wire.android.ui.home.conversationslist.common.CollapsingFolderHeader import com.wire.android.ui.home.conversationslist.common.FolderHeader -@Suppress("LongParameterList") +@Suppress("LongParameterList", "CyclomaticComplexMethod") inline fun LazyListScope.folderWithElements( header: String? = null, items: Map, @@ -51,6 +51,7 @@ inline fun LazyListScope.folderWithElements( .fillMaxWidth() .let { if (animateItemPlacement) it.animateItem() else it } ) + is FolderType.Regular -> FolderHeader( name = header, modifier = Modifier diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 25929bb14ae..1922d478e8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,6 +179,24 @@ All of all participants are verified (Proteus) Scroll to end of conversation Location item + Conversation details, heading + Open conversation options + Options + Participants + Close conversation details + adjust guest access + adjust self-deleting time + edit + select + selected + toggle setting + Guests, heading + Go back to conversation details + Self-deleting messages, heading + Go back to conversation details + open profile + open notification settings + https://medium.com/wire-news/android-updates/home https://medium.com/feed/wire-news/tagged/android diff --git a/core/ui-common/src/main/kotlin/com/wire/android/model/Clickable.kt b/core/ui-common/src/main/kotlin/com/wire/android/model/Clickable.kt index 7e57c836012..af5a24822f6 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/model/Clickable.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/model/Clickable.kt @@ -22,6 +22,8 @@ data class Clickable( val enabled: Boolean = true, val clickBlockParams: ClickBlockParams = ClickBlockParams(), val onLongClick: (() -> Unit)? = null, + val onClickDescription: String? = null, + val onLongClickDescription: String? = null, val onClick: () -> Unit = {} ) diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/Extensions.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/Extensions.kt index 55b4ba6dd17..a428e3f9c7a 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/Extensions.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/Extensions.kt @@ -17,6 +17,7 @@ */ package com.wire.android.ui.common +import android.annotation.SuppressLint import android.widget.Toast import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable @@ -28,6 +29,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.semantics.onClick +import androidx.compose.ui.semantics.onLongClick +import androidx.compose.ui.semantics.semantics import com.wire.android.model.ClickBlockParams import com.wire.android.model.Clickable import com.wire.android.util.LocalSyncStateObserver @@ -60,16 +64,39 @@ fun rememberClickBlockAction(clickBlockParams: ClickBlockParams, clickAction: () } } +@SuppressLint("ComposeComposableModifier") @OptIn(ExperimentalFoundationApi::class) @Composable fun Modifier.clickable(clickable: Clickable?) = clickable?.let { - val onClick = rememberClickBlockAction(clickable.clickBlockParams, clickable.onClick) - val onLongClick = clickable.onLongClick?.let { onLongClick -> - rememberClickBlockAction(clickable.clickBlockParams, onLongClick) + if (clickable.enabled) { + val onClick = rememberClickBlockAction(clickable.clickBlockParams, clickable.onClick) + val onLongClick = clickable.onLongClick?.let { onLongClick -> + rememberClickBlockAction(clickable.clickBlockParams, onLongClick) + } + this.combinedClickable( + enabled = clickable.enabled, + onClick = onClick, + onLongClick = onLongClick + ) + } else { + // even though element is disabled we want to merge all inner elements into one for TalkBack + this.semantics(mergeDescendants = true) { } } - this.combinedClickable( - enabled = clickable.enabled, - onClick = onClick, - onLongClick = onLongClick - ) } ?: this + +@SuppressLint("ComposeComposableModifier", "ComposeModifierWithoutDefault") +@Composable +fun Modifier.clickableDescriptions(clickable: Clickable?) = if (clickable?.enabled == true) { + this.semantics { + clickable.onClickDescription?.let { + this@semantics.onClick(it) { true } + } + if (clickable.onLongClick != null) { + clickable.onLongClickDescription?.let { + this@semantics.onLongClick(it) { true } + } + } + } +} else { + this +} diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/MenuBottomSheetItem.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/MenuBottomSheetItem.kt index 0d4a3b67566..53ad19e1a2b 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/MenuBottomSheetItem.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/MenuBottomSheetItem.kt @@ -42,6 +42,7 @@ import androidx.compose.ui.unit.dp import com.wire.android.model.ClickBlockParams import com.wire.android.model.Clickable import com.wire.android.ui.common.clickable +import com.wire.android.ui.common.clickableDescriptions import com.wire.android.ui.common.divider.WireDivider import com.wire.android.ui.theme.wireDimensions import com.wire.android.ui.theme.wireTypography @@ -56,13 +57,15 @@ fun MenuBottomSheetItem( itemProvidedColor: Color = MaterialTheme.colorScheme.secondary, onItemClick: () -> Unit = {}, enabled: Boolean = true, + onItemClickDescription: String? = null ) { CompositionLocalProvider(LocalContentColor provides itemProvidedColor) { val clickable = remember(onItemClick, clickBlockParams) { Clickable( clickBlockParams = clickBlockParams, onClick = onItemClick, - enabled = enabled + enabled = enabled, + onClickDescription = onItemClickDescription ) } Row( @@ -71,6 +74,7 @@ fun MenuBottomSheetItem( .defaultMinSize(minHeight = MaterialTheme.wireDimensions.conversationBottomSheetItemHeight) .fillMaxWidth() .clickable(clickable) + .clickableDescriptions(clickable) .padding(MaterialTheme.wireDimensions.conversationBottomSheetItemPadding) ) { if (icon != null) { @@ -113,9 +117,9 @@ fun MenuItemTitle( @Composable fun MenuItemIcon( @DrawableRes id: Int, - contentDescription: String, - size: Dp = MaterialTheme.wireDimensions.wireIconButtonSize, - modifier: Modifier = Modifier + contentDescription: String?, + modifier: Modifier = Modifier, + size: Dp = MaterialTheme.wireDimensions.wireIconButtonSize ) { Icon( painter = painterResource(id = id), diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/ModalSheetHeaderItem.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/ModalSheetHeaderItem.kt index c2c9882ce5b..1f00db1864c 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/ModalSheetHeaderItem.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/bottomsheet/ModalSheetHeaderItem.kt @@ -30,6 +30,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.Dp import com.wire.android.ui.common.dimensions import com.wire.android.ui.common.divider.WireDivider @@ -57,7 +59,8 @@ fun ModalSheetHeaderItem(header: MenuModalSheetHeader = MenuModalSheetHeader.Gon Spacer(modifier = Modifier.width(dimensions().spacing8x)) Text( text = header.title, - style = MaterialTheme.wireTypography.title02 + style = MaterialTheme.wireTypography.title02, + modifier = Modifier.semantics { contentDescription = header.title } ) } WireDivider() diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WirePrimaryButton.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WirePrimaryButton.kt index 9abf8a1c644..cc854a4a5d1 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WirePrimaryButton.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WirePrimaryButton.kt @@ -49,6 +49,7 @@ import com.wire.android.ui.theme.wireTypography @Composable fun WirePrimaryButton( onClick: () -> Unit, + modifier: Modifier = Modifier, loading: Boolean = false, leadingIcon: @Composable (() -> Unit)? = null, leadingIconAlignment: IconAlignment = IconAlignment.Center, @@ -69,8 +70,7 @@ fun WirePrimaryButton( horizontal = MaterialTheme.wireDimensions.buttonHorizontalContentPadding, vertical = MaterialTheme.wireDimensions.buttonVerticalContentPadding ), - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - modifier: Modifier = Modifier, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } ) = WireButton( onClick = onClick, loading = loading, diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WireSecondaryButton.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WireSecondaryButton.kt index f2f03e37ad0..b62ee3198f3 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WireSecondaryButton.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/button/WireSecondaryButton.kt @@ -48,6 +48,7 @@ import com.wire.android.ui.theme.wireTypography @Composable fun WireSecondaryButton( onClick: () -> Unit, + modifier: Modifier = Modifier, loading: Boolean = false, leadingIcon: @Composable (() -> Unit)? = null, leadingIconAlignment: IconAlignment = IconAlignment.Center, @@ -68,8 +69,7 @@ fun WireSecondaryButton( horizontal = MaterialTheme.wireDimensions.buttonHorizontalContentPadding, vertical = MaterialTheme.wireDimensions.buttonVerticalContentPadding ), - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - modifier: Modifier = Modifier, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() } ) = WireButton( onClick = onClick, loading = loading, diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/NavigationIconButton.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/NavigationIconButton.kt index 349a65f3fdc..f0618adca53 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/NavigationIconButton.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/NavigationIconButton.kt @@ -20,7 +20,7 @@ package com.wire.android.ui.common.topappbar import androidx.annotation.StringRes import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.Menu @@ -40,11 +40,17 @@ fun NavigationIconButton(iconType: NavigationIconType, onClick: () -> Unit, modi } @Composable -fun BackNavigationIconButton(onBackButtonClick: () -> Unit) { NavigationIconButton(NavigationIconType.Back, onBackButtonClick) } +fun BackNavigationIconButton(onBackButtonClick: () -> Unit) { + NavigationIconButton(NavigationIconType.Back(), onBackButtonClick) +} + +sealed class NavigationIconType(val icon: ImageVector, @StringRes open val contentDescription: Int) { + data class Back(@StringRes override val contentDescription: Int = R.string.content_description_back_button) : + NavigationIconType(Icons.AutoMirrored.Filled.ArrowBack, contentDescription) + + data class Close(@StringRes override val contentDescription: Int = R.string.content_description_close_button) : + NavigationIconType(Icons.Filled.Close, contentDescription) -enum class NavigationIconType(val icon: ImageVector, @StringRes val contentDescription: Int) { - Back(Icons.Filled.ArrowBack, R.string.content_description_back_button), - Close(Icons.Filled.Close, R.string.content_description_close_button), - Menu(Icons.Filled.Menu, R.string.content_description_menu_button), - Collapse(Icons.Filled.KeyboardArrowDown, R.string.content_description_drop_down_icon) + data object Menu : NavigationIconType(Icons.Filled.Menu, R.string.content_description_menu_button) + data object Collapse : NavigationIconType(Icons.Filled.KeyboardArrowDown, R.string.content_description_drop_down_icon) } diff --git a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/WireCenterAlignedTopAppBar.kt b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/WireCenterAlignedTopAppBar.kt index c76c91c5ced..a0fd6deef5d 100644 --- a/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/WireCenterAlignedTopAppBar.kt +++ b/core/ui-common/src/main/kotlin/com/wire/android/ui/common/topappbar/WireCenterAlignedTopAppBar.kt @@ -34,6 +34,8 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.semantics.contentDescription +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.rememberTextMeasurer @@ -56,8 +58,9 @@ fun WireCenterAlignedTopAppBar( maxLines: Int = 2, subtitleContent: @Composable ColumnScope.() -> Unit = {}, onNavigationPressed: () -> Unit = {}, - navigationIconType: NavigationIconType? = NavigationIconType.Back, + navigationIconType: NavigationIconType? = NavigationIconType.Back(), elevation: Dp = MaterialTheme.wireDimensions.topBarShadowElevation, + titleContentDescription: String? = null, actions: @Composable RowScope.() -> Unit = {}, bottomContent: @Composable ColumnScope.() -> Unit = {} ) { @@ -66,7 +69,8 @@ fun WireCenterAlignedTopAppBar( WireTopAppBarTitle( title = title, style = titleStyle, - maxLines = maxLines + maxLines = maxLines, + contentDescription = titleContentDescription ) }, subtitleContent = subtitleContent, @@ -86,7 +90,7 @@ fun WireCenterAlignedTopAppBar( modifier: Modifier = Modifier, subtitleContent: @Composable ColumnScope.() -> Unit = {}, onNavigationPressed: () -> Unit = {}, - navigationIconType: NavigationIconType? = NavigationIconType.Back, + navigationIconType: NavigationIconType? = NavigationIconType.Back(), elevation: Dp = MaterialTheme.wireDimensions.topBarShadowElevation, actions: @Composable RowScope.() -> Unit = {}, bottomContent: @Composable ColumnScope.() -> Unit = {} @@ -118,7 +122,8 @@ fun WireTopAppBarTitle( title: String, style: TextStyle, modifier: Modifier = Modifier, - maxLines: Int = 2 + maxLines: Int = 2, + contentDescription: String? = null ) { // There's an ongoing issue about multiline text taking all width available instead of wrapping visible text. // https://issuetracker.google.com/issues/206039942 @@ -127,6 +132,9 @@ fun WireTopAppBarTitle( // This workaround is based on this: https://stackoverflow.com/a/69947555, but instead of using SubcomposeLayout, we just measure text. BoxWithConstraints( modifier = modifier + .semantics { + contentDescription?.let { this.contentDescription = contentDescription } + } .padding(horizontal = dimensions().spacing6x) ) { val textMeasurer = rememberTextMeasurer() @@ -148,8 +156,7 @@ fun WireTopAppBarTitle( }.toDp() } Text( - modifier = Modifier - .width(width), + modifier = Modifier.width(width), text = title, style = style, maxLines = maxLines, diff --git a/features/sketch/src/main/java/com/wire/android/feature/sketch/DrawingCanvasScreen.kt b/features/sketch/src/main/java/com/wire/android/feature/sketch/DrawingCanvasScreen.kt index a0f9ec7e18c..0f3ec7aa91e 100644 --- a/features/sketch/src/main/java/com/wire/android/feature/sketch/DrawingCanvasScreen.kt +++ b/features/sketch/src/main/java/com/wire/android/feature/sketch/DrawingCanvasScreen.kt @@ -196,7 +196,7 @@ internal fun DrawingTopBar( ) { WireCenterAlignedTopAppBar( title = conversationTitle, - navigationIconType = NavigationIconType.Close, + navigationIconType = NavigationIconType.Close(), onNavigationPressed = dismissAction, actions = { WireSecondaryIconButton( From 8ecd559a7f9d0c182ea844ccae74d76407a2aa72 Mon Sep 17 00:00:00 2001 From: boris Date: Mon, 21 Oct 2024 17:23:07 +0300 Subject: [PATCH 3/3] fix: Crash during asset sharing [WPB-10700] (#3518) Co-authored-by: yamilmedina --- .../sendmessage/SendMessageViewModel.kt | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/sendmessage/SendMessageViewModel.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/sendmessage/SendMessageViewModel.kt index 6b99702527a..ab467292e76 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/sendmessage/SendMessageViewModel.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/sendmessage/SendMessageViewModel.kt @@ -290,22 +290,27 @@ class SendMessageViewModel @Inject constructor( attachmentBundle?.run { when (assetType) { AttachmentType.IMAGE -> { - val (imgWidth, imgHeight) = imageUtil.extractImageWidthAndHeight( - kaliumFileSystem, - attachmentBundle.dataPath - ) - sendAssetMessage( - conversationId = conversationId, - assetDataPath = dataPath, - assetName = fileName, - assetWidth = imgWidth, - assetHeight = imgHeight, - assetDataSize = dataSize, - assetMimeType = mimeType, - audioLengthInMs = 0L - ) - .handleLegalHoldFailureAfterSendingMessage(conversationId) - .handleAssetContributionEvent(assetType) + if (kaliumFileSystem.exists(attachmentBundle.dataPath)) { + val (imgWidth, imgHeight) = imageUtil.extractImageWidthAndHeight( + kaliumFileSystem, + attachmentBundle.dataPath + ) + sendAssetMessage( + conversationId = conversationId, + assetDataPath = dataPath, + assetName = fileName, + assetWidth = imgWidth, + assetHeight = imgHeight, + assetDataSize = dataSize, + assetMimeType = mimeType, + audioLengthInMs = 0L + ) + .handleLegalHoldFailureAfterSendingMessage(conversationId) + .handleAssetContributionEvent(assetType) + } else { + appLogger.e("There was a FileNotFoundException error while sending image asset") + onSnackbarMessage(ConversationSnackbarMessages.ErrorSendingImage) + } } AttachmentType.VIDEO,