Created
December 9, 2020 18:37
-
-
Save rommansabbir/3961954d25db8c1b8fc6d08d4fe5813c to your computer and use it in GitHub Desktop.
How to use Kotlin's Sealed Class in Android Development for better & clean code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sealed class AppFailure { | |
/** | |
* Global Failure classes | |
* These failures will be used across all over the app including Data Layer, Domain Layer, Framework Layer | |
*/ | |
class GeneralFailure(var message: String, var errorCode: Int? = null) : AppFailure() | |
class UnauthorizedFailure(var message: String = "Unauthorized", errorCode: Int? = null) : AppFailure() | |
class LoginFailure(var message: String = "Unable to login", errorCode: Int? = null) : AppFailure() | |
class ServerFailure(var message: String = "Unable to connect to the server side", errorCode: Int? = null) : AppFailure() | |
class NoInternetFailure(var message: String = "Device is not connected to the internet", errorCode: Int? = null) : AppFailure() | |
/** | |
* Feature based failures | |
*/ | |
abstract class FeatureFailure : AppFailure() { | |
class AFailure(var message: String, var errorCode: Int? = null) : FeatureFailure() | |
class BFailure(var message: String, var errorCode: Int? = null) : FeatureFailure() | |
class AnotherFailure(var message: String, var errorCode: Int? = null) : FeatureFailure() | |
} | |
} | |
/** | |
* This sealed class represent the any kind of API result across the application | |
*/ | |
sealed class APIResult { | |
object Loading : APIResult() | |
class Success(var data: Any) : APIResult() | |
class Error(var failure: AppFailure) : APIResult() | |
} | |
/** | |
* Handle all failures here. Place this code into your Base Activity class | |
* | |
* @param failure, [AppFailure] | |
*/ | |
@SuppressLint("LogNotTimber") | |
fun handleFailure(failure: AppFailure) { | |
when (failure) { | |
is AppFailure.GeneralFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.LoginFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.UnauthorizedFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.NoInternetFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.ServerFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.FeatureFailure.AFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.FeatureFailure.BFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
is AppFailure.FeatureFailure.AnotherFailure -> { | |
Log.d("TAG", "handleFailure: ${failure.message}") | |
} | |
else -> { | |
Log.d("TAG", "handleFailure: Something went wrong}") | |
} | |
} | |
} | |
/** | |
* Handle your API calling result here. | |
* Place this code inside your view model | |
* | |
* [Make sure to execute your API calls either using Kotlin's Coroutine or RxJava] | |
*/ | |
fun handleAPIResult(result: APIResult) { | |
when (result) { | |
is APIResult.Loading -> { | |
// Show loading | |
} | |
is APIResult.Success -> { | |
// Hide Loading | |
// Write your logic here | |
} | |
is APIResult.Error -> { | |
// Hide loading | |
/** | |
* Hand over the [APIResult.Error] value which is [AppFailure] to the [handleFailure] | |
* function to handle the failure state | |
*/ | |
handleFailure(result.failure) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment