package Ġnet . x black y . anime x stream . ui . main . home Ċ Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . google . firebase . database .* Ċ import Ġcom . google . firebase . database . k tx . database Ċ import Ġcom . google . firebase . k tx . Firebase Ċ import Ġdagger . h ilt . android . lifecycle . H ilt ViewModel Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . await All Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġnet . x black y . anime x stream . ui . main . home . di . Home Repository Module Ċ import Ġnet . x black y . anime x stream . ui . main . home . source . Home Default Repository Ċ import Ġnet . x black y . anime x stream . ui . main . home . source . Home Repository Ċ import Ġnet . x black y . anime x stream . utils . Result Ċ import Ġnet . x black y . anime x stream . utils . Utils Ċ import Ġnet . x black y . anime x stream . utils . constants . C Ċ import Ġnet . x black y . anime x stream . utils . di . Dispatcher Module Ċ import Ġnet . x black y . anime x stream . utils . model . An ime Meta Model Ċ import Ġnet . x black y . anime x stream . utils . model . Home Screen Model Ċ import Ġnet . x black y . anime x stream . utils . model . Update Model Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . lang . Index OutOfBoundsException Ċ import Ġjavax . inject . Inject Ċ import Ġkotlin . collections . ArrayList Ċ Ċ @ H ilt ViewModel Ċ class ĠHome ViewModel Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġ@ Home Repository Module . Home Repo Ġprivate Ġval Ġrepository : ĠHome Repository , ĊĠĠĠ Ġ@ Dispatcher Module . Main Dispatcher Ġval Ġdispatcher : ĠCor outine Dispatcher Ċ ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġ_ anime List : ĠMutable LiveData < ArrayList < Home Screen Model >> Ġ= ĊĠĠĠĠĠĠĠ ĠMutable LiveData ( make Empty ArrayList ()) ĊĠĠĠ Ġvar Ġan ime List : ĠLive Data < ArrayList < Home Screen Model >> Ġ= Ġ_ anime List ĊĊĊĠĠĠ Ġprivate Ġvar Ġ_ update Model : ĠMutable LiveData < Update Model > Ġ= ĠMutable LiveData () ĊĠĠĠ Ġvar Ġupdate Model : ĠLive Data < Update Model > Ġ= Ġ_ update Model ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠDatabase Reference ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfetch Home List () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfetch Home List () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeferred Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġfetch Recent Sub () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġfetch Recent D ub () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġfetch Pop ular () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġfetch New Season () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync Ġ{ Ġfetch Movies () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . await All () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// TODO ĠMove Ġthis Ġcode Ġto ĠMain ĠActivity ĠRepo Ċ // ĠĠĠ Ġprivate Ġfun Ġquery DB () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠFirebase . database . reference Ċ // ĠĠĠĠĠĠĠ Ġval Ġquery : ĠQuery Ġ= Ġdatabase . child (" app data ") Ċ // ĠĠĠĠĠĠĠ Ġquery . addListener For Single Value Event ( object Ġ: ĠValue EventListener Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Cancelled ( ignored : ĠDatabase Error ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( ignored . message ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Data Change ( snapshot : ĠData Snapshot ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( snapshot . toString ()) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ update Model . value Ġ= ĠUpdate Model ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Code Ġ= Ġsnapshot . child (" version Code "). value Ġas ĠLong , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwh ats New Ġ= Ġsnapshot . child (" whats New "). value . toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ}) Ċ // ĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġupdate Data ( result : ĠResult < ArrayList < An ime Meta Model >>, Ġtype Value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠResult . Success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhome Screen Model Ġ= ĠHome Screen Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Value Ġ= Ġtype Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠUtils . getType Name ( type Value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġan ime List Ġ= Ġresult . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġan ime List . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew List ?. set ( getPosition ByType ( type Value ), Ġhome Screen Model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io be : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ anime List . post Value ( new List ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Position ByType ( type Value : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ REC ENT _ SUB Ġ-> ĠC . REC ENT _ SUB _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ REC ENT _ D UB Ġ-> ĠC . REC ENT _ D UB _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ MOV IE Ġ-> ĠC . MOV IE _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ NEW _ SE ASON Ġ-> ĠC . NEW EST _ SE ASON _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC . TYPE _ POP ULAR _ AN IME Ġ-> ĠC . POP ULAR _ POSITION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġmake Empty ArrayList (): ĠArrayList < Home Screen Model > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġarray List : ĠArrayList < Home Screen Model > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ<= Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarray List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHome Screen Model ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Value Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġarray List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Recent Sub () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . fetch Home Data ( 1 , ĠC . REC ENT _ SUB ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data ( it , ĠC . TYPE _ REC ENT _ SUB ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Recent D ub () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . fetch Home Data ( 1 , ĠC . TYPE _ REC ENT _ D UB ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data ( it , ĠC . TYPE _ REC ENT _ D UB ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Movies () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . fetch Home Data ( 1 , ĠC . TYPE _ MOV IE ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data ( it , ĠC . TYPE _ MOV IE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch Pop ular () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . fetch Home Data ( 1 , ĠC . TYPE _ POP ULAR _ AN IME ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data ( it , ĠC . TYPE _ POP ULAR _ AN IME ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . remove Old Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġfetch New Season () Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . fetch Home Data ( 1 , ĠC . TYPE _ NEW _ SE ASON ). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Data ( it , ĠC . TYPE _ NEW _ SE ASON ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }