Skip to content

Instantly share code, notes, and snippets.

@mlykotom
mlykotom / Connecting_Motivation_AfterInitViewModel.kt
Last active January 3, 2020 09:46
Connecting The Dots :: Motivation - parameters after initialization of ViewModel
class SomeViewModel @Inject constructor(
private val depFromDagger1: Dependency,
private val depFromDagger2: Dependency2
) : ViewModel(){
// may crash with UninitializedPropertyAccessException
lateinit var articleId: String
// must !! or ?. for every access
var fragmentParams: Bundle? = null
@mlykotom
mlykotom / Connecting_Motivation_SomeFragment.kt
Last active January 3, 2020 09:46
Connecting The Dots :: Motivation - manually added dependencies
class SomeFragment : Fragment() {
// inject into this class omitted for brevity
@Inject
lateinit var dep1: Dependency
@Inject
lateinit var dep2: Dependency
lateinit var viewModel : SomeViewModel
@mlykotom
mlykotom / Motivation_SomeViewModel.kt
Last active January 3, 2020 09:18
Connecting The Dots :: Motivation - manually added dependencies
class SomeViewModel(
private val dep1: Dependency,
private val dep2: Dependency2,
private val articleId: String
) : ViewModel() {
class Factory constructor(
private val dep1: Dependency,
private val dep2: Dependency2,
private val articleId: String
@mlykotom
mlykotom / Connecting_InjectingSavedStateViewModelFactory.kt
Last active May 4, 2020 14:06
Connecting The Dots :: InjectingViewModelFactory.kt
@Reusable
class InjectingSavedStateViewModelFactory @Inject constructor(
private val assistedFactories: Map<Class<out ViewModel>, @JvmSuppressWildcards AssistedSavedStateViewModelFactory<out ViewModel>>,
private val viewModelProviders: Map<Class<out ViewModel>, @JvmSuppressWildcards Provider<ViewModel>>
) {
/**
* Creates instance of ViewModel either annotated with @AssistedInject or @Inject and passes dependencies it needs.
*/
fun create(owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null) =
object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@mlykotom
mlykotom / Connecting_SomeFragment.kt
Last active February 7, 2021 20:47
Connecting the dots :: SomeFragment.kt
class SomeFragment() : Fragment() {
// ...
@Inject
lateinit var abstractFactory: dagger.Lazy<InjectingSavedStateViewModelFactory>
/**
* This method androidx uses for `by viewModels` method.
* We can set out injecting factory here and therefore don't touch it again later
@mlykotom
mlykotom / Connecting_SomeViewModel.kt
Last active January 3, 2020 09:47
Connecting the dots :: SomeViewModel.kt
class SomeViewModel @AssistedInject constructor(
private val appContext: Context,
private val someDaggerDependency: SomeDaggerDependency,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
@AssistedInject.Factory
interface Factory : AssistedSavedStateViewModelFactory<SomeViewModel>
}
@mlykotom
mlykotom / Connecting_BuilderModule.kt
Last active February 7, 2021 20:43
Connecting the dots : BuilderModule
@Module
abstract class BuilderModule {
@Binds
@IntoMap
@ViewModelKey(SomeViewModel::class)
abstract fun bindVMFactory(f: SomeViewModel.Factory): AssistedSavedStateViewModelFactory<out ViewModel>
}
@mlykotom
mlykotom / Connecting_InjectingSavedStateViewModelFactory.kt
Last active January 3, 2020 09:48
Connecting the dots :: InjectingSavedStateViewModelFactory.kt
@Reusable
class InjectingSavedStateViewModelFactory @Inject constructor(
private val assistedFactories: Map<Class<out ViewModel>, @JvmSuppressWildcards AssistedSavedStateViewModelFactory<out ViewModel>>
) {
fun create(owner: SavedStateRegistryOwner, defaultArgs: Bundle? = null): AbstractSavedStateViewModelFactory {
return object : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
@Suppress("UNCHECKED_CAST")
override fun <T : ViewModel?> create(key: String, modelClass: Class<T>, handle: SavedStateHandle): T {
// Attempt to get ViewModel from assisted inject factories
@mlykotom
mlykotom / appkill.sh
Last active July 5, 2021 18:26
Script for killing Android app (as system would)
#!/bin/bash
# Provide package of your application (com.example.myapp)
PACKAGE=$1
# First, put your app to background and then run this script
echo "Killing $PACKAGE"
adb shell ps | grep $PACKAGE | awk '{print $2}' | xargs adb shell run-as $PACKAGE kill