diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt index 215559b334..5323531f97 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/ExpandableBottomSheetScaffold.kt @@ -170,9 +170,8 @@ private fun CustomSheetState.getIntOffset(): Int? = try { null } -private sealed class Slot { - data class SheetContent(val key: Int?) : Slot() - data object DragHandle : Slot() - data object Scaffold : Slot() +private sealed interface Slot { + data class SheetContent(val key: Int?) : Slot + data object DragHandle : Slot + data object Scaffold : Slot } - diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt index 85a9dd0c24..7e806e624a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessagesReactionButton.kt @@ -103,11 +103,11 @@ fun MessagesReactionButton( } } -sealed class MessagesReactionsButtonContent { - data class Text(val text: String) : MessagesReactionsButtonContent() - data class Icon(@DrawableRes val resourceId: Int) : MessagesReactionsButtonContent() +sealed interface MessagesReactionsButtonContent { + data class Text(val text: String) : MessagesReactionsButtonContent + data class Icon(@DrawableRes val resourceId: Int) : MessagesReactionsButtonContent - data class Reaction(val reaction: AggregatedReaction) : MessagesReactionsButtonContent() + data class Reaction(val reaction: AggregatedReaction) : MessagesReactionsButtonContent val isHighlighted get() = this is Reaction && reaction.isHighlighted } diff --git a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottler.kt b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottler.kt index f537ddcd4b..dc1de094d7 100644 --- a/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottler.kt +++ b/libraries/androidutils/src/main/kotlin/io/element/android/libraries/androidutils/throttler/FirstThrottler.kt @@ -24,9 +24,9 @@ import android.os.SystemClock class FirstThrottler(private val minimumInterval: Long = 800) { private var lastDate = 0L - sealed class CanHandleResult { - data object Yes : CanHandleResult() - data class No(val shouldWaitMillis: Long) : CanHandleResult() + sealed interface CanHandleResult { + data object Yes : CanHandleResult + data class No(val shouldWaitMillis: Long) : CanHandleResult fun waitMillis(): Long { return when (this) { diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkData.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkData.kt index 0a70055e4f..72caa711cb 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkData.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/permalink/PermalinkData.kt @@ -22,14 +22,14 @@ import android.net.Uri * This sealed class represents all the permalink cases. * You don't have to instantiate yourself but should use [PermalinkParser] instead. */ -sealed class PermalinkData { +sealed interface PermalinkData { data class RoomLink( val roomIdOrAlias: String, val isRoomAlias: Boolean, val eventId: String?, val viaParameters: List - ) : PermalinkData() + ) : PermalinkData /* * &room_name=Team2 @@ -47,9 +47,9 @@ sealed class PermalinkData { val token: String, val privateKey: String, val roomType: String? - ) : PermalinkData() + ) : PermalinkData - data class UserLink(val userId: String) : PermalinkData() + data class UserLink(val userId: String) : PermalinkData - data class FallbackLink(val uri: Uri, val isLegacyGroupLink: Boolean = false) : PermalinkData() + data class FallbackLink(val uri: Uri, val isLegacyGroupLink: Boolean = false) : PermalinkData } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt index c3dd6330b5..3d429766b0 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomList.kt @@ -28,9 +28,9 @@ import kotlin.time.Duration * Can be retrieved from [RoomListService] methods. */ interface RoomList { - sealed class LoadingState { - data object NotLoaded : LoadingState() - data class Loaded(val numberOfRooms: Int) : LoadingState() + sealed interface LoadingState { + data object NotLoaded : LoadingState + data class Loaded(val numberOfRooms: Int) : LoadingState } /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt index 8b85b3fe38..3bd445a282 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/roomlist/RoomListService.kt @@ -25,16 +25,16 @@ import kotlinx.coroutines.flow.StateFlow */ interface RoomListService { - sealed class State { - data object Idle : State() - data object Running : State() - data object Error : State() - data object Terminated : State() + sealed interface State { + data object Idle : State + data object Running : State + data object Error : State + data object Terminated : State } - sealed class SyncIndicator { - data object Show : SyncIndicator() - data object Hide : SyncIndicator() + sealed interface SyncIndicator { + data object Show : SyncIndicator + data object Hide : SyncIndicator } /** diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/WriteToFilesConfiguration.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/WriteToFilesConfiguration.kt index 01aeb208ca..27b378846d 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/WriteToFilesConfiguration.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/tracing/WriteToFilesConfiguration.kt @@ -16,7 +16,7 @@ package io.element.android.libraries.matrix.api.tracing -sealed class WriteToFilesConfiguration { - data object Disabled : WriteToFilesConfiguration() - data class Enabled(val directory: String, val filenamePrefix: String) : WriteToFilesConfiguration() +sealed interface WriteToFilesConfiguration { + data object Disabled : WriteToFilesConfiguration + data class Enabled(val directory: String, val filenamePrefix: String) : WriteToFilesConfiguration } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/PressEvent.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/PressEvent.kt index 96dff11cad..340540886d 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/PressEvent.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/PressEvent.kt @@ -16,8 +16,8 @@ package io.element.android.libraries.textcomposer.model -sealed class PressEvent { - data object PressStart: PressEvent() - data object Tapped: PressEvent() - data object LongPressEnd: PressEvent() +sealed interface PressEvent { + data object PressStart: PressEvent + data object Tapped: PressEvent + data object LongPressEnd: PressEvent } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessagePlayerEvent.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessagePlayerEvent.kt index 7f827caef7..193c72969b 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessagePlayerEvent.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessagePlayerEvent.kt @@ -16,11 +16,11 @@ package io.element.android.libraries.textcomposer.model -sealed class VoiceMessagePlayerEvent { - data object Play: VoiceMessagePlayerEvent() - data object Pause: VoiceMessagePlayerEvent() +sealed interface VoiceMessagePlayerEvent { + data object Play: VoiceMessagePlayerEvent + data object Pause: VoiceMessagePlayerEvent data class Seek( val position: Float - ): VoiceMessagePlayerEvent() + ): VoiceMessagePlayerEvent } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageState.kt index 6cf3166f68..e418e64a1c 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/model/VoiceMessageState.kt @@ -19,8 +19,8 @@ package io.element.android.libraries.textcomposer.model import kotlinx.collections.immutable.ImmutableList import kotlin.time.Duration -sealed class VoiceMessageState { - data object Idle: VoiceMessageState() +sealed interface VoiceMessageState { + data object Idle: VoiceMessageState data class Preview( val isSending: Boolean, @@ -29,10 +29,10 @@ sealed class VoiceMessageState { val playbackProgress: Float, val time: Duration, val waveform: ImmutableList, - ): VoiceMessageState() + ): VoiceMessageState data class Recording( val duration: Duration, val levels: ImmutableList, - ): VoiceMessageState() + ): VoiceMessageState } diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/utils/PressState.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/utils/PressState.kt index 714581feb1..50df6d591c 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/utils/PressState.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/utils/PressState.kt @@ -19,13 +19,13 @@ package io.element.android.libraries.textcomposer.utils /** * State of a press gesture. */ -internal sealed class PressState { +internal sealed interface PressState { data class Idle( val lastPress: Pressing? - ) : PressState() + ) : PressState - sealed class Pressing : PressState() - data object Tapping : Pressing() - data object LongPressing : Pressing() + sealed interface Pressing : PressState + data object Tapping : Pressing + data object LongPressing : Pressing } diff --git a/libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorderState.kt b/libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorderState.kt index 04c532e86b..42035615d5 100644 --- a/libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorderState.kt +++ b/libraries/voicerecorder/api/src/main/kotlin/io/element/android/libraries/voicerecorder/api/VoiceRecorderState.kt @@ -19,11 +19,11 @@ package io.element.android.libraries.voicerecorder.api import java.io.File import kotlin.time.Duration -sealed class VoiceRecorderState { +sealed interface VoiceRecorderState { /** * The recorder is idle and not recording. */ - data object Idle : VoiceRecorderState() + data object Idle : VoiceRecorderState /** * The recorder is currently recording. @@ -31,7 +31,7 @@ sealed class VoiceRecorderState { * @property elapsedTime The elapsed time since the recording started. * @property levels The current audio levels of the recording as a fraction of 1. */ - data class Recording(val elapsedTime: Duration, val levels: List) : VoiceRecorderState() + data class Recording(val elapsedTime: Duration, val levels: List) : VoiceRecorderState /** * The recorder has finished recording. @@ -46,5 +46,5 @@ sealed class VoiceRecorderState { val mimeType: String, val waveform: List, val duration: Duration, - ) : VoiceRecorderState() + ) : VoiceRecorderState } diff --git a/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Audio.kt b/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Audio.kt index 3e51d615f4..e9f0dd21cf 100644 --- a/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Audio.kt +++ b/libraries/voicerecorder/impl/src/main/kotlin/io/element/android/libraries/voicerecorder/impl/audio/Audio.kt @@ -16,13 +16,13 @@ package io.element.android.libraries.voicerecorder.impl.audio -sealed class Audio { +sealed interface Audio { class Data( val readSize: Int, val buffer: ShortArray, - ) : Audio() + ) : Audio data class Error( val audioRecordErrorCode: Int - ) : Audio() + ) : Audio } diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistArchitectureTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistArchitectureTest.kt index 6ed58b61e8..a650eda0cc 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistArchitectureTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistArchitectureTest.kt @@ -21,7 +21,9 @@ import com.lemonappdev.konsist.api.ext.list.constructors import com.lemonappdev.konsist.api.ext.list.modifierprovider.withSealedModifier import com.lemonappdev.konsist.api.ext.list.parameters import com.lemonappdev.konsist.api.ext.list.withNameEndingWith +import com.lemonappdev.konsist.api.ext.list.withoutConstructors import com.lemonappdev.konsist.api.ext.list.withoutName +import com.lemonappdev.konsist.api.ext.list.withoutParents import com.lemonappdev.konsist.api.verify.assertEmpty import com.lemonappdev.konsist.api.verify.assertTrue import org.junit.Test @@ -55,4 +57,14 @@ class KonsistArchitectureTest { .withNameEndingWith("Events") .assertEmpty(additionalMessage = "Events class MUST be sealed interface") } + + @Test + fun `Sealed class without constructor and without parent MUST be sealed interface`() { + Konsist.scopeFromProject() + .classes() + .withSealedModifier() + .withoutConstructors() + .withoutParents() + .assertEmpty(additionalMessage = "Sealed class without constructor MUST be sealed interface") + } }