From cfa48d1df71e13d07d42894351fd65d07c51eabc Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 11 Jun 2025 14:12:54 +0200 Subject: [PATCH] Annotate Composable function with `ReadOnlyComposable` where it's possible. (#4859) --- .../features/lockscreen/impl/setup/pin/SetupPinView.kt | 3 +++ .../android/features/login/impl/error/ChangeServerError.kt | 2 ++ .../features/messages/impl/actionlist/ActionListView.kt | 2 ++ .../preferences/impl/advanced/AdvancedSettingsState.kt | 4 ++++ .../element/android/libraries/designsystem/text/DpScale.kt | 3 +++ .../android/libraries/designsystem/text/UnitConverters.kt | 6 ++++++ .../libraries/designsystem/utils/WindowInsetsExtension.kt | 2 ++ .../android/libraries/permissions/api/PermissionsView.kt | 2 ++ 8 files changed, 24 insertions(+) diff --git a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinView.kt b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinView.kt index 3e51849a76..81bfa4c1a4 100644 --- a/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinView.kt +++ b/features/lockscreen/impl/src/main/kotlin/io/element/android/features/lockscreen/impl/setup/pin/SetupPinView.kt @@ -19,6 +19,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -124,6 +125,7 @@ private fun SetupPinContent( } @Composable +@ReadOnlyComposable private fun SetupPinFailure.content(): String { return when (this) { SetupPinFailure.ForbiddenPin -> stringResource(id = R.string.screen_app_lock_setup_pin_forbidden_dialog_content) @@ -132,6 +134,7 @@ private fun SetupPinFailure.content(): String { } @Composable +@ReadOnlyComposable private fun SetupPinFailure.title(): String { return when (this) { SetupPinFailure.ForbiddenPin -> stringResource(id = R.string.screen_app_lock_setup_pin_forbidden_dialog_title) diff --git a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt index e3fdfc2d04..6d678854c1 100644 --- a/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt +++ b/features/login/impl/src/main/kotlin/io/element/android/features/login/impl/error/ChangeServerError.kt @@ -9,6 +9,7 @@ package io.element.android.features.login.impl.error import androidx.annotation.StringRes import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.res.stringResource import io.element.android.features.login.impl.R import io.element.android.features.login.impl.changeserver.UnauthorizedAccountProviderException @@ -21,6 +22,7 @@ sealed class ChangeServerError : Throwable() { val messageStr: String? = null, ) : ChangeServerError() { @Composable + @ReadOnlyComposable fun message(): String = messageStr ?: stringResource(messageId ?: CommonStrings.error_unknown) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt index 8eb4bb8554..f849effb1a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListView.kt @@ -30,6 +30,7 @@ import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.ripple import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -394,6 +395,7 @@ private fun VerifiedUserSendFailureView( modifier: Modifier = Modifier, ) { @Composable + @ReadOnlyComposable fun VerifiedUserSendFailure.headline(): String { return when (this) { is None -> "" diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt index 5b91c65f08..58f93fc665 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/advanced/AdvancedSettingsState.kt @@ -8,6 +8,7 @@ package io.element.android.features.preferences.impl.advanced import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.res.stringResource import io.element.android.libraries.designsystem.components.preferences.DropdownOption import io.element.android.libraries.matrix.api.media.MediaPreviewValue @@ -26,14 +27,17 @@ data class AdvancedSettingsState( enum class ThemeOption : DropdownOption { System { @Composable + @ReadOnlyComposable override fun getText(): String = stringResource(CommonStrings.common_system) }, Dark { @Composable + @ReadOnlyComposable override fun getText(): String = stringResource(CommonStrings.common_dark) }, Light { @Composable + @ReadOnlyComposable override fun getText(): String = stringResource(CommonStrings.common_light) } } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/DpScale.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/DpScale.kt index 258d24cb99..856160d7bf 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/DpScale.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/DpScale.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.tooling.preview.Preview @@ -27,6 +28,7 @@ import io.element.android.libraries.designsystem.theme.components.Text * will be smaller. */ @Composable +@ReadOnlyComposable fun Dp.applyScaleDown(): Dp = with(LocalDensity.current) { return this@applyScaleDown * fontScale.coerceAtMost(1f) } @@ -37,6 +39,7 @@ fun Dp.applyScaleDown(): Dp = with(LocalDensity.current) { * will be bigger. */ @Composable +@ReadOnlyComposable fun Dp.applyScaleUp(): Dp = with(LocalDensity.current) { return this@applyScaleUp * fontScale.coerceAtLeast(1f) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/UnitConverters.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/UnitConverters.kt index c358517946..eaf6712830 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/UnitConverters.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/text/UnitConverters.kt @@ -8,6 +8,7 @@ package io.element.android.libraries.designsystem.text import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.TextUnit @@ -17,6 +18,7 @@ import androidx.compose.ui.unit.TextUnit * Can be used for instance to use Dp unit for text. */ @Composable +@ReadOnlyComposable fun Dp.toSp(): TextUnit = with(LocalDensity.current) { toSp() } /** @@ -24,22 +26,26 @@ fun Dp.toSp(): TextUnit = with(LocalDensity.current) { toSp() } * Can be used for instance to use Sp unit for size. */ @Composable +@ReadOnlyComposable fun TextUnit.toDp(): Dp = with(LocalDensity.current) { toDp() } /** * Convert Px value to Dp, regarding current density. */ @Composable +@ReadOnlyComposable fun Int.toDp(): Dp = with(LocalDensity.current) { toDp() } /** * Convert Dp value to pixels, regarding current density. */ @Composable +@ReadOnlyComposable fun Dp.toPx(): Float = with(LocalDensity.current) { toPx() } /** * Convert Dp value to pixels, regarding current density. */ @Composable +@ReadOnlyComposable fun Dp.roundToPx(): Int = with(LocalDensity.current) { roundToPx() } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/WindowInsetsExtension.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/WindowInsetsExtension.kt index f70cb5424e..a3a471875b 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/WindowInsetsExtension.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/utils/WindowInsetsExtension.kt @@ -9,10 +9,12 @@ package io.element.android.libraries.designsystem.utils import androidx.compose.foundation.layout.WindowInsets import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalLayoutDirection @Composable +@ReadOnlyComposable fun WindowInsets.copy( top: Int? = null, right: Int? = null, diff --git a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsView.kt b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsView.kt index 3823b1b8e1..1748a02db4 100644 --- a/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsView.kt +++ b/libraries/permissions/api/src/main/kotlin/io/element/android/libraries/permissions/api/PermissionsView.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.permissions.api import android.Manifest import androidx.compose.runtime.Composable +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter @@ -41,6 +42,7 @@ fun PermissionsView( } @Composable +@ReadOnlyComposable private fun String.toDialogContent(): String { return when (this) { Manifest.permission.POST_NOTIFICATIONS -> stringResource(id = R.string.dialog_permission_notification)