From 1acae50845854f91fe1cb771589c56c3d99ac4ee Mon Sep 17 00:00:00 2001 From: Zongle Wang Date: Sat, 30 Mar 2024 03:11:53 +0800 Subject: [PATCH] Convert some sealed classes to interfaces (#4347) There is no non-abstract field in them, we can just fall back to interfaces. --- .../compose/ComposeAutoCompleteAdapter.kt | 8 +++--- .../tusky/components/compose/MediaUploader.kt | 8 +++--- .../components/login/LoginWebViewActivity.kt | 8 +++--- .../com/keylesspalace/tusky/util/Either.kt | 26 ++++++++++--------- .../com/keylesspalace/tusky/util/Resource.kt | 10 ++++--- .../tusky/viewdata/StatusViewData.kt | 8 +++--- .../tusky/viewdata/TrendingViewData.kt | 14 +++++----- .../viewmodel/AccountsInListViewModel.kt | 1 + 8 files changed, 43 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt index 16c1eabda..c37644cee 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeAutoCompleteAdapter.kt @@ -145,12 +145,12 @@ class ComposeAutoCompleteAdapter( } } - sealed class AutocompleteResult { - class AccountResult(val account: TimelineAccount) : AutocompleteResult() + sealed interface AutocompleteResult { + class AccountResult(val account: TimelineAccount) : AutocompleteResult - class HashtagResult(val hashtag: String) : AutocompleteResult() + class HashtagResult(val hashtag: String) : AutocompleteResult - class EmojiResult(val emoji: Emoji) : AutocompleteResult() + class EmojiResult(val emoji: Emoji) : AutocompleteResult } interface AutocompletionProvider { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt index 3ec43748a..03ac83227 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/MediaUploader.kt @@ -64,13 +64,13 @@ import retrofit2.HttpException sealed interface FinalUploadEvent -sealed class UploadEvent { - data class ProgressEvent(val percentage: Int) : UploadEvent() +sealed interface UploadEvent { + data class ProgressEvent(val percentage: Int) : UploadEvent data class FinishedEvent( val mediaId: String, val processed: Boolean - ) : UploadEvent(), FinalUploadEvent - data class ErrorEvent(val error: Throwable) : UploadEvent(), FinalUploadEvent + ) : UploadEvent, FinalUploadEvent + data class ErrorEvent(val error: Throwable) : UploadEvent, FinalUploadEvent } data class UploadData( diff --git a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt index b8c113b90..421f81032 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/login/LoginWebViewActivity.kt @@ -91,15 +91,15 @@ data class LoginData( val oauthRedirectUrl: Uri ) : Parcelable -sealed class LoginResult : Parcelable { +sealed interface LoginResult : Parcelable { @Parcelize - data class Ok(val code: String) : LoginResult() + data class Ok(val code: String) : LoginResult @Parcelize - data class Err(val errorMessage: String) : LoginResult() + data class Err(val errorMessage: String) : LoginResult @Parcelize - data object Cancel : LoginResult() + data object Cancel : LoginResult } /** Activity to do Oauth process using WebView. */ diff --git a/app/src/main/java/com/keylesspalace/tusky/util/Either.kt b/app/src/main/java/com/keylesspalace/tusky/util/Either.kt index 728ccd0e0..3baf50596 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/Either.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/Either.kt @@ -21,27 +21,29 @@ package com.keylesspalace.tusky.util * Class to represent sum type/tagged union/variant/ADT e.t.c. * It is either Left or Right. */ -sealed class Either { - data class Left(val value: L) : Either() - data class Right(val value: R) : Either() +sealed interface Either { + data class Left(val value: L) : Either + data class Right(val value: R) : Either - fun isRight() = this is Right + fun isRight(): Boolean = this is Right - fun isLeft() = this is Left + fun isLeft(): Boolean = this is Left - fun asLeftOrNull() = (this as? Left)?.value + fun asLeftOrNull(): L? = (this as? Left)?.value - fun asRightOrNull() = (this as? Right)?.value + fun asRightOrNull(): R? = (this as? Right)?.value fun asLeft(): L = (this as Left).value fun asRight(): R = (this as Right).value - inline fun map(crossinline mapper: (R) -> N): Either { - return if (this.isLeft()) { - Left(this.asLeft()) - } else { - Right(mapper(this.asRight())) + companion object { + inline fun Either.map(crossinline mapper: (R) -> N): Either { + return if (this.isLeft()) { + Left(this.asLeft()) + } else { + Right(mapper(this.asRight())) + } } } } diff --git a/app/src/main/java/com/keylesspalace/tusky/util/Resource.kt b/app/src/main/java/com/keylesspalace/tusky/util/Resource.kt index c04eb05c2..0f212b0ca 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/Resource.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/Resource.kt @@ -1,14 +1,16 @@ package com.keylesspalace.tusky.util -sealed class Resource(open val data: T?) +sealed interface Resource { + val data: T? +} -class Loading(override val data: T? = null) : Resource(data) +class Loading(override val data: T? = null) : Resource -class Success(override val data: T? = null) : Resource(data) +class Success(override val data: T? = null) : Resource class Error( override val data: T? = null, val errorMessage: String? = null, var consumed: Boolean = false, val cause: Throwable? = null -) : Resource(data) +) : Resource diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.kt b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.kt index f2f60cb1d..f25d82e4f 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/StatusViewData.kt @@ -22,12 +22,12 @@ import com.keylesspalace.tusky.entity.Translation import com.keylesspalace.tusky.util.parseAsMastodonHtml import com.keylesspalace.tusky.util.shouldTrimStatus -sealed class TranslationViewData { - abstract val data: Translation? +sealed interface TranslationViewData { + val data: Translation? - data class Loaded(override val data: Translation) : TranslationViewData() + data class Loaded(override val data: Translation) : TranslationViewData - data object Loading : TranslationViewData() { + data object Loading : TranslationViewData { override val data: Translation? get() = null } diff --git a/app/src/main/java/com/keylesspalace/tusky/viewdata/TrendingViewData.kt b/app/src/main/java/com/keylesspalace/tusky/viewdata/TrendingViewData.kt index 6eae73319..99b09409d 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewdata/TrendingViewData.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewdata/TrendingViewData.kt @@ -17,15 +17,14 @@ package com.keylesspalace.tusky.viewdata import java.util.Date -sealed class TrendingViewData { - abstract val id: String +sealed interface TrendingViewData { + val id: String data class Header( val start: Date, val end: Date - ) : TrendingViewData() { - override val id: String - get() = start.toString() + end.toString() + ) : TrendingViewData { + override val id: String = start.toString() + end.toString() } data class Tag( @@ -33,8 +32,7 @@ sealed class TrendingViewData { val usage: List, val accounts: List, val maxTrendingValue: Long - ) : TrendingViewData() { - override val id: String - get() = name + ) : TrendingViewData { + override val id: String = name } } diff --git a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountsInListViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountsInListViewModel.kt index 4765bd849..3c5229eb8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountsInListViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/viewmodel/AccountsInListViewModel.kt @@ -23,6 +23,7 @@ import at.connyduck.calladapter.networkresult.fold import com.keylesspalace.tusky.entity.TimelineAccount import com.keylesspalace.tusky.network.MastodonApi import com.keylesspalace.tusky.util.Either +import com.keylesspalace.tusky.util.Either.Companion.map import com.keylesspalace.tusky.util.Either.Left import com.keylesspalace.tusky.util.Either.Right import com.keylesspalace.tusky.util.withoutFirstWhich