Skip to content

Instantly share code, notes, and snippets.

View osipxd's full-sized avatar
💭
I may be slow to respond.

Osip Fatkullin osipxd

💭
I may be slow to respond.
View GitHub Profile
@osipxd
osipxd / DI.kt
Last active April 12, 2020 10:07
Dagger AssistedInject + ViewModel
import com.squareup.inject.assisted.dagger2.AssistedModule
import dagger.Module
@Component(
modules = [ViewModelAssistedFactoriesModule::class] // <--- Add assisted module
)
interface SampleComponent {
fun inject(fragment: SampleFragment)
@osipxd
osipxd / ViewBinding.kt
Last active May 20, 2020 05:04
View binding extensions + delegate
/**
* Инфлейт ViewBinding заданного типа [T].
*
* В качестве родителя используется [ViewGroup], по умолчанию view прикрепляется к корню родителя.
* **ВАЖНО!** Для инфлейта вьюх с `merge` в корне нужно использовать только этот метод.
*/
inline fun <reified T : ViewBinding> ViewGroup.inflateViewBinding(
context: Context = this.context,
attachToRoot: Boolean = true
): T {
@osipxd
osipxd / ViewModelFactory.kt
Created March 27, 2020 14:48
Dagger ViewModel Multibinding
class ViewModelFactory @Inject constructor(
private val providers: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
val provider = providers[modelClass]
?: providers.asIterable().find { modelClass.isAssignableFrom(it.key) }?.value
?: error("Unknown ViewModel class $modelClass")
return try {
@osipxd
osipxd / EventsQueue.kt
Created March 27, 2020 11:22
ViewModel and LiveData extensions
import androidx.annotation.MainThread
import androidx.lifecycle.MutableLiveData
import java.util.LinkedList
import java.util.Queue
/**
* Класс-очередь для обработки временных событий, не являющихся частью View
* Например, показ SnackBar с сообщением или ошибкой.
*/
class EventsQueue : MutableLiveData<Queue<Event>>() {
@osipxd
osipxd / setLocale.kt
Last active April 15, 2024 12:15
Set locale in Android application
import android.app.Activity
import android.app.Application
import android.content.ComponentCallbacks
import android.content.Context
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import java.util.Locale
private const val LANGUAGE_RU = "ru"
@osipxd
osipxd / DetailsFragment.kt
Last active May 13, 2020 11:46
Partial view state rendering with LiveData transformations
class DetailsFragment : BaseFragment(R.layout.fragment_details) {
lateinit val viewModel: DetailsViewModel
// ...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onVewCreated(view, savedInstanceState)
// Assumed that viewModel initialized here
@osipxd
osipxd / FragmentContainerActivity.kt
Last active January 16, 2020 13:11
Activity wrapper for any fragment
package com.example
import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.Fragment
import com.example.R
import com.example.BaseActivity
class FragmentContainerActivity : BaseActivity() {
@osipxd
osipxd / CachingRxJava2CallAdapterFactory.kt
Last active September 15, 2022 07:41
Caching RxJava2 call adapter for Retrofit2
package retrofit2.adapter.rxjava2
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Maybe
import io.reactivex.Observable
import io.reactivex.Single
import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Retrofit
@osipxd
osipxd / paper-versions.json
Created May 14, 2018 06:39
Paper versions builds
{
"latest": "1.12.2",
"versions": {
"1.12.2": "lastSuccessfulBuild",
"1.11.2": "1104",
"1.10.2": "916",
"1.9.4": "773",
"1.8.8": "443"
}
}