package Ġcom . ky lix . submission b aj p 2 . util Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . ky lix . submission b aj p 2 . inject . Injection Ċ import Ġcom . ky lix . submission b aj p 2 . model . repository . Data Repository Ċ import Ġcom . ky lix . submission b aj p 2 . ui . movie . Movie ViewModel Ċ import Ġcom . ky lix . submission b aj p 2 . ui . tv show . Tv Show ViewModel Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠViewModel Factory ( private Ġval Ġdata Repository : ĠData Repository ): ĠViewModel Provider . New Instance Factory () Ġ{ ĊĠĠĠ Ġcompanion Ġobject { ĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġvar ĠINSTANCE : ĠViewModel Factory ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance (): ĠViewModel Factory ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( ViewModel Factory :: class . java ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( INSTANCE Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINSTANCE Ġ= ĠViewModel Factory ( Injection . movie Repository ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠINSTANCE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠViewModel ?> Ġcreate ( model Class : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Class . isAssignableFrom ( Movie ViewModel :: class . java ) Ġ-> ĠMovie ViewModel ( data Repository ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel Class . isAssignableFrom ( Tv Show ViewModel :: class . java ) Ġ-> ĠT v Show ViewModel ( data Repository ) Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Unknown ĠViewModel : Ġ" Ġ+ Ġmodel Class . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }