package Ġba . ah av ic . exchange me . presentation . base . di Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġdagger . Bind s Ċ import Ġdagger . Map Key Ċ import Ġdagger . Module Ċ import Ġdagger . mult ib ind ings . Mult ib inds Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Provider Ċ import Ġkotlin . reflect . K Class Ċ Ċ class ĠViewModel Factory Ċ @ Inject Ġconstructor ( private Ġval ĠviewModel Providers : ĠMap < Class < out ĠViewModel >, Ġ@ Jvm Suppress W ild cards ĠProvider < ViewModel >>) ĊĠĠĠ Ġ: ĠViewModel Provider . Factory Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠviewModel Providers [ model Class ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Missing Ġprovider Ġfor Ġclass Ġ${ model Class . canonical Name }") ĊĠĠĠĠĠĠĠ Ġval ĠviewModel Ġ= Ġprovider . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠNullPointerException (" Provider Ġfor ĠViewModel Ġmay Ġnot Ġreturn Ġnull ! Ġ( provider Ġfor Ġ${ model Class . canonical Name }") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( model Class . is Instance ( viewModel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠviewModel Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} Ġ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠClass CastException (" Provider Ġfor Ġ${ model Class . canonical Name } Ġreturned ĠViewModel Ġof Ġwrong Ġtype ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Must Be Document ed Ċ @ Target ( Annotation Target . FUNCTION , ĊĠĠĠ ĠAnnotation Target . PROPERTY _ GET TER , ĊĠĠĠ ĠAnnotation Target . PROPERTY _ SET TER Ċ ) Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Map Key Ċ annotation Ġclass ĠViewModel Key ( val Ġvalue : ĠK Class < out ĠViewModel >) Ċ Ċ @ Module Ċ abstract Ġclass ĠViewModel Factory Module Ġ{ ĊĊĠĠĠ Ġ@ Bind s ĊĠĠĠ Ġabstract Ġfun Ġbind ViewModel Factory ( factory : ĠViewModel Factory ): ĠViewModel Provider . Factory ĊĊĠĠĠ Ġ@ Mult ib inds ĊĠĠĠ Ġabstract Ġfun Ġbind ViewModel Providers (): ĠMap < Class < out ĠViewModel >, ĠViewModel > Ċ }