@Singleton class ApplicationInjector @Inject constructor( private val injectorFactories: Map, @JvmSuppressWildcards Provider> ) : Application.ActivityLifecycleCallbacks { //region < Unused callback methods > override fun onActivityPaused(activity: Activity) = Unit override fun onActivityResumed(activity: Activity) = Unit override fun onActivityStarted(activity: Activity) = Unit override fun onActivityDestroyed(activity: Activity) = Unit override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle?) = Unit //endregion /** * Map of components that survive a configuration change. */ private val screenComponents: MutableMap, ProvidesActivityInjectorFactories> = HashMap() override fun onActivityStopped(activity: Activity) { if (activity.isFinishing) { // remove finished activity component screenComponents.remove(activity.javaClass) } } override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { val screenComponent: ProvidesActivityInjectorFactories = screenComponents[activity.javaClass] ?: injectorFactories[activity.javaClass]!!.get().build().also { screenComponents[activity.javaClass] = it } @Suppress("UNCHECKED_CAST") val activityInjectorFactory: AndroidInjector.Factory = (screenComponent.provideInjectors()[activity.javaClass] as AndroidInjector.Factory) activityInjectorFactory.create(activity).inject(activity) } }