Skip to content

Instantly share code, notes, and snippets.

View krzdabrowski's full-sized avatar

Krzysztof Dąbrowski krzdabrowski

View GitHub Profile
dependencies {
// ...
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion"
implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:$retrofitCoroutinesAdapterVersion"
}
class RocketViewModel(private val repository: RocketRepository) : BaseViewModel<Rocket>() {
private lateinit var rocketList: LiveData<List<Rocket>>
override fun getDataFromRetrofit(): LiveData<List<Rocket>> {
rocketList = repository.loadData()
return rocketList
}
}
dependencies {
// ...
implementation "org.koin:koin-android:$koinVersion"
implementation "org.koin:koin-androidx-viewmodel:$koinVersion"
}
val networkModule = module {
single { SpaceXService.create() }
}
val repositoryModule = module {
single { RocketRepository(get(), get()) }
single { FlightRepository(get(), get()) }
single { EventRepository(get(), get()) }
}
class GenericAdapter<T>(private val context: Context, private val items: List<T>)
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when {
items.all { it is Rocket } -> RocketViewHolder(LayoutInflater.from(context).inflate(R.layout.item_rocket, parent, false))
items.all { it is Flight } -> FlightViewHolder(LayoutInflater.from(context).inflate(R.layout.item_flight, parent, false))
else -> EventViewHolder(LayoutInflater.from(context).inflate(R.layout.item_event, parent, false))
}
}
class RocketViewHolder(private val view: View) : RecyclerView.ViewHolder(view), GenericAdapter.Binder<Rocket> {
override fun bind(data: Rocket) {
view.tv_rocket_name.text = data.name
// ...
}
}
object ObjectBox {
lateinit var boxStore: BoxStore
private set
fun init(context: Context): BoxStore {
if (::boxStore.isInitialized && !boxStore.isClosed) {
return boxStore
}
val boxModule = module {
single { ObjectBox.init(androidContext()) }
}
@GET("rockets")
fun getRocketsAsync(): Deferred<Response<List<Rocket>>>
@GET("launches/upcoming")
fun getNextFlightsAsync(): Deferred<Response<List<Flight>>>
@GET("history")
fun getPastEventsAsync(): Deferred<Response<List<Event>>>
companion object {
inline fun <reified T: Any> fetchData(crossinline call: (SpaceXService) -> Deferred<Response<List<T>>>): LiveData<List<T>> {
val result = MutableLiveData<List<T>>()
CoroutineScope(Dispatchers.IO).launch {
val request = call(service)
withContext(Dispatchers.Main) {
try {
val response = request.await()
if (response.isSuccessful) {
result.value = response.body()