package Ġs jj . no vel . view . module . main Ċ Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . databinding . Observable Boolean Ċ import Ġandroidx . databinding . Observable Field Ċ import Ġandroidx . databinding . Observable Int Ċ import Ġio . reactivex . Flow able Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . processors . Behavior Processor Ċ import Ġs jj . no vel . R Ċ import Ġs jj . no vel . data . repository . no vel Data Repository Ċ import Ġs jj . no vel . data . repository . no vel Source Repository Ċ import Ġs jj . no vel . data . source . local . local Fi ction DataSource Ċ import Ġs jj . no vel . model . Book Ċ import Ġs jj . no vel . model . Book Source Record Ċ import Ġs jj . no vel . model . Chapter Ċ import Ġs jj . no vel . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ class ĠBook She lf ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġbooks : ĠFlow able < List < Book She lf Item ViewModel >> Ġ= Ġnovel Data Repository . get Books (). flatMap Ġ{ Ġlist Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġlist . map Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBook She lf Item ViewModel (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . book Ġ= Ġbook ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook Name . set ( book . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauthor . set ( R . string . author _. res Str ( book . author )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook Cover . onNext ( book . book Cover Img Url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloading . set ( book . load Status Ġ== ĠBook . Load State . Loading ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠObservable . from Iterable ( map ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnovel Data Repository . get Latest Chapter ( it . book . url ). map Ġ{ Ġchapter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . last Chapter . set ( R . string . new est _. res Str ( chapter . chapter Name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . book . last Chapter Ġ= Ġchapter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. switch If Empty ( Observable . just ( it )) ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnovel Data Repository . get Book Source Record ( model . book . name , Ġmodel . book . author ). first Element (). to Observable (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . book Source Record Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . have Read . set ( R . string . have Read _. res Str ( it . chapter Name )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . remaining Chapter . set ( max Of (( model . book . last Chapter ?. index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 ) Ġ- Ġit . read Index Ġ+ Ġ( if Ġ( it . is Through ) Ġ 0 Ġelse Ġ 1 ), Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ Ġmodel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnovel Source Repository . get Book Parse ( model . book . name , Ġmodel . book . author ). map Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . origin . set ( R . string . origin _. res Str ( list . find Ġ{ Ġmodel . book . url . host . endsWith ( it . top Level Domain ) Ġ} ?. source Name , Ġlist . size )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. toList (). to Flow able (). map Ġ{ Ġmutable List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable List . sortBy Ġ{ Ġit . book Source Record . sequence Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġ åĪ·æĸ° ä¹¦ ç± į ä¹¦ ç± į ãĢĤ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrefresh (): ĠObservable < Book > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnovel Data Repository . get Books () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¯¹ å°ı è¯´ è¿Ľè¡Į åĪĨ ç»Ħ ä½¿ åĲĮ åĲĮ ä¸Ģ æĿ¥ æºĲ çļĦ å°ı è¯´ ä¸Ģæ¬¡ æĢ§ åıĳ å°Ħ åĩº åİ» ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġmutable Map Of < String , ĠMutable List < Book >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap . get Or Put ( it . url . host ) Ġ{ Ġmutable ListOf () Ġ}. add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠObservable . from Iterable ( map . values ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. lazy From Iterable Ġ{ Ġbook Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnovel Data Repository . refresh Book ( book . url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. delay ( 5 0 0 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Read Index ( index : ĠChapter , Ġbook : ĠBook ): ĠObservable < Int > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnovel Data Repository . set Read Index ( book . name , Ġbook . author , Ġindex , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Book Source Record Seq ( list : ĠList < Book Source Record >): ĠObservable < List < Book Source Record >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlocal Fi ction DataSource . update Book Source Record Seq ( list ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġdelete ( book : ĠBook ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnovel Data Repository . delete Book ( book . name , Ġbook . author ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBook She lf Item ViewModel Ġ{ ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġbook : ĠBook ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġbook Source Record : ĠBook Source Record ĊĊĠĠĠĠĠĠĠ Ġvar Ġbook Cover Ġ= ĠBehavior Processor . create < String >() ĊĠĠĠĠĠĠĠ Ġval Ġbook Name Ġ= ĠObservable Field < String >() ĊĠĠĠĠĠĠĠ Ġval Ġauthor Ġ= ĠObservable Field < String >() ĊĠĠĠĠĠĠĠ Ġval Ġlast Chapter Ġ= ĠObservable Field < String >() ĊĠĠĠĠĠĠĠ Ġval Ġhave Read Ġ= ĠObservable Field < String >() ĊĠĠĠĠĠĠĠ Ġval Ġremaining Chapter Ġ= ĠObservable Int () ĊĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= ĠObservable Field < String >() ĊĠĠĠĠĠĠĠ Ġval Ġloading Ġ= ĠObservable Boolean () ĊĠĠĠĠĠĠĠ Ġval Ġid : ĠLong Ġby Ġlazy Ġ{ Ġbook . url . id Ġ} ĊĠĠĠ Ġ} Ċ Ċ }