Skip to content

Instantly share code, notes, and snippets.

@digitalbuddha
Last active June 15, 2020 21:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save digitalbuddha/4c63034969c107af3c98e098ae5ffbe7 to your computer and use it in GitHub Desktop.
Save digitalbuddha/4c63034969c107af3c98e098ae5ffbe7 to your computer and use it in GitHub Desktop.
@DefineComponent(parent = ApplicationComponent::class)
internal interface UserComponent
@DefineComponent.Builder
internal interface UserComponentBuilder {
fun withUserId(@BindsInstance userId: Int): UserComponentBuilder
fun build(): UserComponent
}
@DefineComponent(parent = UserComponent::class)
internal interface ActivityUserComponent
@DefineComponent.Builder
internal interface ActivityUserComponentBuilder {
fun withActivity(@BindsInstance activity: Activity): ActivityUserComponentBuilder
fun build(): ActivityUserComponent
}
@EntryPoint
@InstallIn(UserComponent::class)
internal interface ActivityUserComponentBuilderEntryPoint {
fun activityUserComponentBuilder(): ActivityUserComponentBuilder
}
@EntryPoint
@InstallIn(ActivityUserComponent::class)
interface CalendarInjector {
fun inject(calendarActivity: CalendarActivity)
}
internal var currentUser: UserComponent? = null
internal fun createUserComponent(application: Application, userId: Int = 1) =
(application as CalendarApp).userComponentBuilder.withUserId(userId)
.build()
internal fun createActivityComponent(activity: Activity): ActivityUserComponent {
val userComponent: UserComponent = currentUser ?: createUserComponent(activity.application)
val buildEntryPoint = userComponent as ActivityUserComponentBuilderEntryPoint
return buildEntryPoint
.activityUserComponentBuilder()
.withActivity(activity)
.build()
}
@HiltAndroidApp
class CalendarApp : Application(){
@Inject
internal lateinit var userComponentBuilder: UserComponentBuilder
}
@EntryPoint
@InstallIn(ActivityUserComponent::class)
interface CalendarInjector {
fun inject(calendarActivity: CalendarActivity)
}
private fun calendarInjector(calendarActivity: CalendarActivity) {
val activityComponent = createActivityComponent(calendarActivity)
EntryPoints.get(activityComponent, CalendarInjector::class.java).inject(calendarActivity)
}
class CalendarActivity : AppCompatActivity() {
@Inject
lateinit var userId: Integer
@Inject
lateinit var activity: Activity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarInjector(this)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment