Skip to content

Instantly share code, notes, and snippets.

View hacomeister's full-sized avatar

Hakan Erbaş hacomeister

View GitHub Profile
object TFCViewModelFactory : ViewModelProvider.Factory {
lateinit var application: Application
lateinit var dependencies: UseCases
fun inject(application: Application, dependencies: UseCases) {
TFCViewModelFactory.application = application
TFCViewModelFactory.dependencies = dependencies
}
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if(BaseViewModel::class.java.isAssignableFrom(modelClass)) {
return modelClass.getConstructor(Application::class.java, UseCases::class.java)
class TFCApplication : Application() {
@ExperimentalSerializationApi
override fun onCreate() {
super.onCreate()
val apiService = Retrofit.Builder().baseUrl(Constant.BASE_URL).addConverterFactory(GsonConverterFactory.create()).build().create(ApiService::class.java)
val coinRepository = CoinRepository(CoinDataSource(apiService))
TFCViewModelFactory.inject(this, UseCases(GetAllCoinsUseCase(coinRepository = coinRepository)))
}
open class BaseViewModel(application: Application, protected val useCases: UseCases) : AndroidViewModel(application) {
protected val application: TFCApplication = getApplication()
}
data class UseCases(val getAllCoinsUseCase: GetAllCoinsUseCase)
/**
* Implementation class of coin data source
*/
class CoinDataSource(private val apiService: ApiService) : CoinDataSource {
override suspend fun getAll(): List<CoinEntity> {
return apiService.getAllCoinsFirst100()
}
}
/**
* Mapper class for Coin
*/ class CoinMapper @Inject constructor() : Mapper<CoinNetwork, CoinEntity> {
override fun from(e: CoinEntity?): CoinNetwork {
return CoinNetwork(
current_price = e?.current_price,
image = e?.image,
name = e?.name,
price_change_percentage_24h = e?.price_change_percentage_24h,
symbol = e?.symbol
interface Mapper<T, E> {
fun from(e: E?): T
fun to(t: T?): E
}
/**
* Service and Endpoints
*/
interface ApiService {
@GET("coins/markets")
suspend fun getAllCoinsFirst100(
@Query("vs_currency") vs_currency: String = "usd",
@Query("order") order: String = "market_cap_desc",
@Query("per_page") perPage: Int = 3,
@Query("page") page: Int = 1,
class CoinRepository(private val dataSource: CoinDataSource): ICoinRepository {
override suspend fun getAll(): List<CoinEntity> {
return dataSource.getAll()
}
}
interface CoinDataSource {
suspend fun getAll(): List<CoinEntity>
}