package Ġsl ak . fan fi ction stories . activities Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . annotation . Any Thread Ċ import Ġandroidx . annotation . Ui Thread Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . card view . widget . Card View Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroidx . activity . view Models Ċ import Ġkotlinx . android . synt hetic . main . activity _ reviews .* Ċ import Ġkotlinx . android . synt hetic . main . component _ review . view .* Ċ import Ġkotlinx . android . synt hetic . main . dialog _ report _ review . view .* Ċ import Ġkotlinx . android . synt hetic . main . loading _ activity _ in determinate .* Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers . Main Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġsl ak . fan fi ction stories . R Ċ import Ġsl ak . fan fi ction stories . Story Model Ċ import Ġsl ak . fan fi ction stories . data . Prefs Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . NO _ PAGES Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . Review Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . fetch Story Model Ċ import Ġsl ak . fan fi ction stories . data . fetch ers . get Reviews Ċ import Ġsl ak . fan fi ction stories . utility .* Ċ import Ġjava . util .* Ċ Ċ /** ĠStores Ġand Ġf etches Ġthe Ġdata Ġrequired Ġfor Ġa Ġ[ Reviews Activity ]. Ġ*/ Ċ @ Suppress (" PLATFORM _ CLASS _ MAP PED _ TO _ K OT LIN ") Ċ class ĠRe views ViewModel ( val Ġmodel : ĠStory Model , Ġinitial Chapter : ĠInteger ) Ġ: ĊĠĠĠ ĠViewModel (), ĊĠĠĠ ĠI Adapter Data Observable Ġby ĠAdapter Data Observable () Ġ{ ĊĠ Ġprivate Ġval Ġ_ chapter Ġ= ĠMutable LiveData < Int >() ĊĠ Ġval Ġchapter : ĠLive Data < Int > Ġget () Ġ= Ġ_ chapter ĊĊĠ Ġenum Ġclass ĠLoad Event Ġ{ ĠLO ADING , ĠDONE _ LOADING Ġ} ĊĊĠ Ġprivate Ġval Ġloading Events Data Ġ= ĠMutable LiveData < Load Event >() ĊĠ Ġval Ġloading Event : ĠLive Data < Load Event > Ġget () Ġ= Ġloading Events Data ĊĊĠ Ġprivate Ġvar ĠcurrentPage Ġ= Ġ 0 ĊĠ Ġvar Ġpage Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġset ĊĠ Ġvar Ġreview Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġset ĊĊĠ Ġprivate Ġval Ġreviews List : ĠMutable List < Review > Ġ= Ġmutable ListOf () ĊĠ Ġval Ġreviews : ĠList < Review > Ġget () Ġ= Ġreviews List ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġchange Chapter ( initial Chapter . toInt ()) ĊĠ Ġ} ĊĊĠ Ġ@ Ui Thread ĊĠ Ġfun Ġchange Chapter ( new Chapter : ĠInt ) Ġ{ ĊĠĠĠ Ġclear () ĊĠĠĠ ĠcurrentPage Ġ= Ġ 1 ĊĠĠĠ Ġpage Count Ġ= Ġ 0 ĊĠĠĠ Ġreview Count Ġ= Ġ 0 ĊĠĠĠ Ġ_ chapter . it Ġ= Ġnew Chapter ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġclear () Ġ{ ĊĠĠĠ Ġval Ġsize Ġ= Ġreviews List . size ĊĠĠĠ Ġreviews List . clear () ĊĠĠĠ Ġnotify Item Range Removed ( 0 , Ġsize ) ĊĠ Ġ} ĊĊĠ Ġ@ Any Thread ĊĠ Ġfun Ġload Page ( coroutine Scope : ĠCor outine Scope ) Ġ= Ġcoroutine Scope . launch ( Main ) Ġ{ ĊĠĠĠ Ġif Ġ( page Count Ġ!= Ġ 0 Ġ&& ĠcurrentPage Ġ>= Ġpage Count ) Ġreturn @ launch ĊĠĠĠ Ġloading Events Data . it Ġ= ĠLoad Event . LOADING ĊĠĠĠ Ġval Ġ( list , Ġpages , Ġreviews ) Ġ= Ġget Reviews ( model . story Id , Ġ_ chapter . it , ĠcurrentPage ) ĊĠĠĠ Ġif Ġ( page Count Ġ== Ġ 0 ) Ġpage Count Ġ= Ġpages ĊĠĠĠ Ġif Ġ( review Count Ġ== Ġ 0 ) Ġreview Count Ġ= Ġreviews ĊĠĠĠ Ġreviews List . addAll ( list ) ĊĠĠĠ Ġnotify Item Range Inserted ( reviews List . size Ġ- Ġlist . size , Ġlist . size ) ĊĠĠĠ Ġloading Events Data . it Ġ= ĠLoad Event . DONE _ LOADING ĊĠĠĠ ĠcurrentPage ++ ĊĠ Ġ} Ċ } Ċ Ċ /** ĠPresent s Ġa Ġstory 's Ġreviews . Ġ*/ Ċ class ĠRe views Activity Ġ: ĠCor outine Scope Activity (), ĠI Has Loading Bar Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠINTENT _ ST ORY _ MODEL Ġ= Ġ" story _ model _ extra " ĊĠĠĠ Ġconst Ġval ĠINTENT _ TARGET _ CH AP TER Ġ= Ġ" target _ chapter _ extra " ĊĠĠĠ Ġprivate Ġconst Ġval ĠALL _ CH AP TER S Ġ= Ġ 0 ĊĠ Ġ} ĊĊĠ Ġoverride Ġval Ġloading : ĠProgress Bar ĊĠĠĠ Ġget () Ġ= Ġactivity ProgressBar ĊĊĠ Ġprivate Ġlateinit Ġvar Ġmodel Target : ĠPair < Story Model , ĠInt > ĊĠ Ġprivate Ġval ĠviewModel : ĠRe views ViewModel Ġby Ġview Models Ġ{ ĠViewModel Factory ( model Target . first , Ġmodel Target . second ) Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠ ĠsetContentView ( R . layout . activity _ reviews ) ĊĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĠĠĠ Ġset Loading View ( toolbar ) ĊĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠ Ġ// Ġrun Blocking Ġis Ġfine Ġhere , Ġbecause Ġthe Ġloading Ġbar Ġis Ġalready Ġin Ġplace , Ġand Ġso Ġthe Ġuser ĊĠĠĠ Ġ// Ġalready Ġexpects Ġto Ġwait ĊĠĠĠ Ġmodel Target Ġ= Ġif Ġ( intent . action Ġ== ĠIntent . ACTION _ VIEW ) Ġrun Blocking Ġ{ ĊĠĠĠĠĠ Ġval Ġpath Segments Ġ= Ġintent ?. data ?. path Segments ĊĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Missing Ġintent Ġdata ") ĊĠĠĠĠĠ Ġval Ġchapter Ġ= Ġif Ġ( path Segments . size Ġ< Ġ 3 ) ĠALL _ CH AP TER S Ġelse Ġpath Segments [ 2 ]. toInt () ĊĠĠĠĠĠ Ġval Ġmodel Ġ= Ġfetch Story Model ( path Segments [ 1 ]. to Long ()) ĊĠĠĠĠĠĠĠĠĠ Ġ. orElse Throw ( IllegalArgumentException (" Story Ġdoesn 't Ġexist ")) ĊĠĠĠĠĠ Ġreturn @ run Blocking Ġmodel Ġto Ġchapter ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġchapter Ġ= Ġintent . getInt Extra ( INT ENT _ TARGET _ CH AP TER , ĠALL _ CH AP TER S ) ĊĠĠĠĠĠ Ġval Ġmodel : ĠStory Model Ġ= Ġintent . get Parcelable Extra ( INT ENT _ ST ORY _ MODEL ) !! ĊĠĠĠĠĠ Ġmodel Ġto Ġchapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġtitle Ġ= Ġstr ( R . string . reviews _ for , ĠviewModel . model . title ) ĊĊĠĠĠ Ġreview List . adapter Ġ= ĠReview Adapter ( viewModel ) ĊĠĠĠ Ġval Ġlayout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĠĠĠ Ġreview List . layout Manager Ġ= Ġlayout Manager ĊĊĠĠĠ ĠviewModel . loading Event . observe ( this ) Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ ĠRe views ViewModel . Load Event . LOADING Ġ-> Ġshow Loading () ĊĠĠĠĠĠĠĠ ĠRe views ViewModel . Load Event . DONE _ LOADING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhide Loading () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . page Count Ġ== ĠNO _ PAGES ) Ġno Reviews Text . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġno Reviews Text . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠ Ġset Subtitle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠviewModel . load Page ( this ) ĊĠĠĠ Ġinfinite Page Scroll ( review List , Ġlayout Manager ) Ġ{ ĠviewModel . load Page ( this ) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Subtitle () Ġ{ ĊĠĠĠ Ġ// ĠNo Ġneed Ġfor Ġa Ġsubtitle Ġsaying Ġwhich Ġchapter Ġit Ġis Ġwhen Ġthere Ġis Ġonly Ġone ĊĠĠĠ Ġif Ġ( viewModel . model . fragment . chapter Count Ġ== Ġ 1 L ) Ġ{ ĊĠĠĠĠĠ Ġtoolbar . subtitle Ġ= Ġ"" ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġtoolbar . subtitle Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( viewModel . chapter . value Ġ== ĠALL _ CH AP TER S ) Ġstr ( R . string . all _ chapter s ) ĊĠĠĠĠĠĠĠ Ġelse Ġstr ( R . string . x _ reviews _ for _ chapter _ y , ĠviewModel . review Count , ĠviewModel . chapter . value ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Prepare Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠ Ġmenu . find Item ( R . id . select Reviews For ). icon Tint ( R . color . white , Ġtheme ) ĊĠĠĠ Ġreturn Ġsuper . on Prepare Options Menu ( menu ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// ĠDon 't Ġshow Ġa Ġchapter Ġselection Ġmenu Ġif Ġthere Ġis Ġonly Ġone Ġchapter ĊĠĠĠ Ġif Ġ( viewModel . model . fragment . chapter Count Ġ== Ġ 1 L ) Ġreturn Ġfalse ĊĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ reviews , Ġmenu ) ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠ ĠR . id . select Reviews For Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitems Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstr ( R . string . all _ chapter s ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ* viewModel . model . chapter Titles (). to Typed Array () ĊĠĠĠĠĠĠĠ Ġ). to Typed Array () ĊĠĠĠĠĠĠĠ ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . select _ chapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Single Choice Items ( items , ĠviewModel . chapter . value !! Ġ- Ġ 1 ) Ġ{ Ġdialog , Ġwhich : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( viewModel . chapter . value Ġ== Ġwhich ) Ġreturn @ set Single Choice Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . change Chapter ( which ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . load Page ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Subtitle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġon Back Pressed () ĊĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} Ċ } Ċ Ċ /** ĠFor Ġusing Ġ[ Review ] Ġobjects Ġwith Ġ[ RecyclerView ]. Ġ*/ Ċ class ĠReview Adapter ( private Ġval ĠviewModel : ĠRe views ViewModel ) Ġ: ĠRecyclerView . Adapter < RecyclerView . ViewHolder >() Ġ{ ĊĠ Ġclass ĠReview Holder ( val Ġview : ĠCard View ) Ġ: ĠRecyclerView . ViewHolder ( view ) ĊĊĠ Ġprivate Ġval Ġvm Observer Ġ= Ġcreate Observer For Adapter ( this ) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠviewModel . register Observer ( vm Observer ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠ Ġreturn ĠReview Holder ( LayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠ Ġ. inflate ( R . layout . component _ review , Ġparent , Ġfalse ) Ġas ĠCard View ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġbind Review Props ( view : ĠCard View , Ġreview : ĠReview ) Ġ= Ġwith ( view ) Ġ{ ĊĠĠĠ Ġreview Author . text Ġ= Ġreview . author ĊĠĠĠ Ġreview Chapter . text Ġ= Ġstr ( R . string . chapter _ x , Ġreview . chapter ) ĊĠĠĠ Ġreview Date . text Ġ= ĠP refs . simple Date Formatter ĊĠĠĠĠĠĠĠ Ġ. format ( Date ( review . unix Time Seconds Ġ* Ġ 1 0 0 0 )) ĊĠĠĠ Ġreview Content . text Ġ= Ġreview . content ĊĠĠĠ Ġview Author Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠ ĠstartActivity < Author Activity >( ĊĠĠĠĠĠĠĠĠĠ ĠAuthor Activity . INT ENT _ AUTHOR _ ID Ġto Ġreview . author Id , ĊĠĠĠĠĠĠĠĠĠ ĠAuthor Activity . INT ENT _ AUTHOR _ NAME Ġto Ġreview . author ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( review . author Id Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠ Ġview Author Btn . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠ Ġreply Btn . visibility Ġ= ĠView . GONE ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġview Author Btn . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠ Ġreply Btn . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Suppress Lint (" Inf late Params ") ĊĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġpos : ĠInt ) Ġ= Ġwith ( holder . item View ) Ġ{ ĊĠĠĠ Ġbind Review Props ( this Ġas ĠCard View , ĠviewModel . reviews [ pos ]) ĊĠĠĠ Ġreply Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġ// ĠFIXME : Ġreply Ġto Ġreview ĊĠĠĠ Ġ} ĊĠĠĠ Ġreport Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġval Ġlayout Ġ= ĠLayoutInflater . from ( context ). inflate ( R . layout . dialog _ report _ review , Ġnull , Ġfalse ) ĊĠĠĠĠĠ Ġ// ĠWe Ġwant Ġthe Ġmargin , Ġso Ġinvisible ĊĠĠĠĠĠ Ġlayout . off ending Review . divider . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠ Ġlayout . off ending Review . btn Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠ Ġlayout . off ending Review . elevation Ġ= Ġ 2 0 F ĊĠĠĠĠĠ Ġbind Review Props ( layout . off ending Review Ġas ĠCard View , ĠviewModel . reviews [ pos ]) ĊĠĠĠĠĠ ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setTitle ( R . string . dialog _ report _ ab use ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setView ( layout ) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . report ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFIXME : Ġsend Ġreport ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĠĠĠ Ġforce Layout () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= ĠviewModel . reviews . size Ċ } Ċ