package Ġat . sh ock bytes . d ante . ui . fragment Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . app . DatePicker Dialog Ċ import Ġandroid . content . Broadcast Receiver Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Intent Filter Ċ import Ġandroid . graphics . drawable . Bitmap Drawable Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . palette . graphics . Palette Ċ import Ġandroid . view . H aptic Feedback Constants Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . Menu Inflater Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Accel erate De cel erate Interpolator Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . annotation . Color Int Ċ import Ġandroidx . core . app . Activity Options Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . local broadcast manager . content . Local Broadcast Manager Ċ import Ġat . sh ock bytes . d ante . R Ċ import Ġat . sh ock bytes . d ante . core . book . Book Entity Ċ import Ġat . sh ock bytes . d ante . core . book . Book Id Ċ import Ġat . sh ock bytes . d ante . core . book . Book Ids Ċ import Ġat . sh ock bytes . d ante . core . book . Book Label Ċ import Ġat . sh ock bytes . d ante . core . book . Book State Ċ import Ġat . sh ock bytes . d ante . injection . App Component Ċ import Ġat . sh ock bytes . d ante . ui . activity . core . Tint able Back Navig able Activity Ċ import Ġat . sh ock bytes . d ante . core . image . Image Loader Ċ import Ġat . sh ock bytes . d ante . core . image . Image Loading Callback Ċ import Ġat . sh ock bytes . d ante . databinding . Fragment Book Detail Binding Ċ import Ġat . sh ock bytes . d ante . navigation . Activity Navigator Ċ import Ġat . sh ock bytes . d ante . navigation . Destination Ċ import Ġat . sh ock bytes . d ante . ui . activity . Notes Activity Ċ import Ġat . sh ock bytes . d ante . ui . custom . book sp ages . Books And Page Record DataPoint Ċ import Ġat . sh ock bytes . d ante . ui . custom . book sp ages . Books And Pages Diagram Action Ċ import Ġat . sh ock bytes . d ante . ui . custom . book sp ages . Books And Pages Diagram Options Ċ import Ġat . sh ock bytes . d ante . ui . custom . book sp ages . Marker View Label Factory Ċ import Ġat . sh ock bytes . d ante . ui . view model . Book Detail ViewModel Ċ import Ġat . sh ock bytes . d ante . ui . view . Animation Utils Ċ import Ġat . sh ock bytes . d ante . ui . view . Chip Factory Ċ import Ġat . sh ock bytes . d ante . util . D ante Utils Ċ import Ġat . sh ock bytes . d ante . util . D ante Utils . dp To Pixel F Ċ import Ġat . sh ock bytes . d ante . util . Exception Handlers Ċ import Ġat . sh ock bytes . d ante . util . addTo Ċ import Ġat . sh ock bytes . d ante . util . register For PopupMenu Ċ import Ġat . sh ock bytes . d ante . util . setVisible Ċ import Ġat . sh ock bytes . d ante . util . viewModel Of Ċ import Ġat . sh ock bytes . util . App Utils Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġio . reactivex . Observable Ċ import Ġio . reactivex . android . schedul ers . Android Schedulers Ċ import Ġio . reactivex . schedul ers . Schedulers Ċ import Ġorg . joda . time . DateTime Ċ import Ġru . bull yb oo . view . Circle Seek Bar Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . util . Calendar Ċ import Ġjavax . inject . Inject Ċ Ċ /** Ċ Ġ* ĠAuthor : Ġ ĠMartin ĠM ache iner Ċ Ġ* ĠDate : ĠĠĠĠ 0 2 . 0 2 . 2 0 1 9 Ċ Ġ*/ Ċ class ĠBook Detail Fragment Ġ: ĠBase Fragment < Fragment Book Detail Binding >(), ĊĠĠĠ ĠBack Anim atable , ĊĠĠĠ ĠImage Loading Callback , ĊĠĠĠ ĠCircle Seek Bar . Callback Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate View Binding ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġroot : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ Ġattach To Root : ĠBoolean ĊĠĠĠ Ġ): ĠFragment Book Detail Binding Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFragment Book Detail Binding . inflate ( in flater , Ġroot , Ġattach To Root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġvm Factory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġimage Loader : ĠImage Loader ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠBook Detail ViewModel ĊĊĠĠĠ Ġprivate Ġvar Ġmenu Item Edit : ĠMenuItem ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġanim atable Views List : ĠList < View > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . iv Detail Image , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . txt Detail Title , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . txt Detail Subtitle , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . txt Detail Author , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . txt Detail Description , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . sb Detail Pages , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Pages , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Rate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Notes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Published , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . divider Book Details Extras , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . pages Diagram View , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . h sv Labels , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . layout Detail Dates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Wish h list Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail StartDate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail EndDate ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġicon Loading Map : ĠList < Pair < Int , ĠTextView >> Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ published _ date , Ġvb . btn Detail Published ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ rating , Ġvb . btn Detail Rate ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ pages , Ġvb . btn Detail Pages ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ notes , Ġvb . btn Detail Notes ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ tab _ up coming , Ġvb . btn Detail Wish h list Date ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ tab _ current , Ġvb . btn Detail StartDate ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( R . drawable . ic _ tab _ done , Ġvb . btn Detail EndDate ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġnotes Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( p 0 : ĠContext ?, Ġdata : ĠIntent ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Notes Ġ= Ġdata ?. extras ?. getString ( Notes Activity . NOTES _ EXTRA ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Notes ( updated Notes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Notes ( updated Notes . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbook Updated Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( p 0 : ĠContext ?, Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . reload () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset Has Options Menu ( true ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠviewModel Of ( vm Factory ) ĊĠĠĠĠĠĠĠ Ġarguments ?. getLong ( ARG _ BOOK _ ID , ĠBook Ids . default ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( viewModel :: initialize With Book Id ) ĊĊĠĠĠĠĠĠĠ Ġregister Local Broadcast Receiver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu , Ġinflater : ĠMenu Inflater ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . menu . menu _ book _ detail , Ġmenu ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Edit Ġ= Ġmenu . find Item ( R . id . menu _ book _ detail _ edit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġregister Local Broadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( notes Receiver , ĠIntent Filter ( Notes Activity . ACTION _ NOTES )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( book Updated Receiver , ĠIntent Filter ( ACTION _ BOOK _ CHANGED )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup View Listener () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCol lapse Ġ/ Ġun fold Ġsummary Ġwhen Ġclicking Ġon Ġit ĊĠĠĠĠĠĠĠ Ġvb . txt Detail Description . setOnClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . perform H aptic Feedback ( H aptic Feedback Constants . VIRTUAL _ KEY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Lines Ġ= Ġresources . getInteger ( R . integer . detail _ summary _ default _ lines ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Lines Ġ= Ġvb . txt Detail Description . max Lines ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġif Ġ( current Lines Ġ== Ġdefault Lines ) Ġ 1 0 0 Ġelse Ġdefault Lines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation Duration Ġ= Ġif Ġ( current Lines Ġ== Ġdefault Lines ) Ġ 2 5 0 L Ġelse Ġ 1 0 0 L ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠObject Animator . of Int ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . txt Detail Description , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max Lines ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġanimation Duration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinject To Graph ( app Component : ĠApp Component ) Ġ{ ĊĠĠĠĠĠĠĠ Ġapp Component . inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbind ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . getView State (). observe ( this , Ġ{ Ġview State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Book Information ( view State . book , Ġview State . show Summary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Time Information ( view State . book ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . get Labels (). observe ( this , ĠObserver (:: setup Labels )) ĊĊĠĠĠĠĠĠĠ ĠviewModel . getPage Records ViewState (). observe ( this , ĠObserver (:: handle Page Record ViewState )) ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Book Detail Event () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe (:: handle Book Detail Event , ĠException Handlers :: default ExceptionHandler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Book Finished Dialog Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġtitle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. title ( text Ġ= ĠgetString ( R . string . book _ finished , Ġtitle )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. message ( R . string . book _ finished _ move _ to _ done _ question ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. icon ( R . drawable . ic _ pick _ done ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. corner Radius ( require Context (). dp To Pixel F ( 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. positive Button ( android . R . string . ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . move Book To Done () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. support Finish After Transition () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Pages Dialog Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: create Pages Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ante Utils . add Fragment To Activity ( parent FragmentManager , Ġfragment , Ġandroid . R . id . content , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Notes Dialog Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġdata Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Navigator . navigate To ( context , ĠDestination . Notes ( data )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Rating Dialog Event ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: create Rate Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ante Utils . add Fragment To Activity ( parent FragmentManager , Ġfragment , Ġandroid . R . id . content , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Book Edit Request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map ( Destination :: Manual Add ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe ({ Ġdestination Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscene Transition Ġ= Ġactivity ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Options Compat . make Scene Transition Animation ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. to Bundle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Navigator . navigate To ( context , Ġdestination , Ġscene Transition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ Ġthrowable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( throwable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Add Labels Request ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe (:: show Label Picker , ĠException Handlers :: default ExceptionHandler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Pages Fragment ( page Info : ĠBook Detail ViewModel . Page Info ): ĠPages Fragment Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( currentPage , Ġpage Count ) Ġ= Ġpage Info ĊĠĠĠĠĠĠĠ Ġreturn ĠPages Fragment . newInstance ( currentPage , Ġpage Count ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Page Edited Listener Ġ= Ġ{ Ġcurrent , Ġpages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Book Pages ( current , Ġpages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Rate Fragment ( data : ĠBook Detail ViewModel . Rating Info ): ĠRate Fragment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠRate Fragment . newInstance ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Rate ClickListener Ġ= Ġ{ Ġrating Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Rating ( rating ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Rate . text Ġ= Ġresources . get Quantity String ( R . plurals . book _ rating , Ġrating , Ġrating ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġun bind ViewModel () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . getView State (). remove Observer s ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( require Context ()). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver ( notes Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver ( book Updated Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . on Fragment Destroyed () ĊĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Backward Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġanim atable Views List . forEach Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . clear Animation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . alpha Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġload Icons () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Image Loading Failed ( e : ĠException ?) Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d ( e ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Image Resource Ready ( resource : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( resource Ġas ? ĠBitmap Drawable )?. bitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let ( Palette :: from ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . generate (:: on Palette Generated ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Palette Generated ( palette : ĠPalette ?) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġpalette ?. light Mut ed Sw atch ?. title TextColor ?. let Ġ{ ĠtextColor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt int Edit MenuItem ( textColor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Color Ġ= Ġpalette ?. light Mut ed Sw atch ?. rgb ĊĠĠĠĠĠĠĠ Ġval Ġaction Bar TextColor Ġ= Ġpalette ?. light Mut ed Sw atch ?. title TextColor ĊĠĠĠĠĠĠĠ Ġval Ġstatus Bar Color Ġ= Ġpalette ?. dark Mut ed Sw atch ?. rgb ĊĊĠĠĠĠĠĠĠ Ġ( activity Ġas ? ĠT int able Back Navig able Activity <* >) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . tint System Bar sWith Text ( action Bar Color , Ġaction Bar TextColor , Ġstatus Bar Color ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġt int Edit MenuItem (@ Color Int Ġt int Color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Item Edit ?. icon ?. let Ġ{ Ġicon Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= ĠDrawable Compat . wrap ( icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( drawable , Ġt int Color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item Edit ?. setIcon ( drawable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Scrolling ( start Value : ĠInt ) Ġ= ĠUnit ĊĊĠĠĠ Ġoverride Ġfun Ġon End Scrolling ( end Value : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . update Current Page ( end Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== ĠR . id . menu _ book _ detail _ edit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . request Edit Book () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ-------------------------------------------------------------------- ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Book Information ( book : ĠBook Entity , Ġshow Summary : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvb . txt Detail Title . text Ġ= Ġbook . title ĊĠĠĠĠĠĠĠ Ġvb . txt Detail Author . text Ġ= Ġbook . author ĊĊĠĠĠĠĠĠĠ Ġvb . btn Detail Published . text Ġ= Ġif Ġ( book . published Date . isNotEmpty ()) Ġbook . published Date Ġelse Ġ" --- " ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Rate . text Ġ= Ġif Ġ( book . rating Ġin Ġ 1 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Quantity String ( R . plurals . book _ rating , Ġbook . rating , Ġbook . rating ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠgetString ( R . string . rate _ book ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠHide Ġsubtitle Ġif Ġnot Ġavailable ĊĠĠĠĠĠĠĠ Ġvb . txt Detail Subtitle . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Visible ( book . sub Title . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġbook . sub Title ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvb . txt Detail Description . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Visible ( book . summary Ġ!= Ġnull Ġ&& Ġshow Summary ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġbook . summary ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġload Image ( book . normalized Thumbnail Url ) ĊĊĠĠĠĠĠĠĠ Ġsetup Notes ( book . notes . isNull OrEmpty ()) ĊĠĠĠĠĠĠĠ Ġsetup Page Components ( book . state , Ġbook . reading , Ġbook . has Pages , Ġbook . page Count , Ġbook . currentPage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Page Record ViewState ( ĊĠĠĠĠĠĠĠ Ġpage Record ViewState : ĠBook Detail ViewModel . Page Records ViewState ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( page Record ViewState ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBook Detail ViewModel . Page Records ViewState . Present Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . group Details Pages . setVisible ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Page Records ( page Record ViewState . data Points , Ġpage Record ViewState . book Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBook Detail ViewModel . Page Records ViewState . Absent Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . group Details Pages . setVisible ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Book Detail Event ( event : ĠBook Detail ViewModel . Book Detail Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBook Detail ViewModel . Book Detail Event . Message Ġ-> Ġshow Toast ( event . msg Res ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Page Records ( ĊĠĠĠĠĠĠĠ Ġdata Points : ĠList < Books And Page Record DataPoint >, ĊĠĠĠĠĠĠĠ Ġbook Id : ĠBook Id ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvb . pages Diagram View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetData ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Points , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagram Options Ġ= ĠBooks And Pages Diagram Options ( initial Zero Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel Factory Ġ= ĠMarker View Label Factory . of Books And Page Record Data Points ( data Points , ĠR . string . pages _ formatted ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠBooks And Pages Diagram Action . Overflow ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister On Action Click Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Page Records Overview ( book Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader Title Ġ= ĠgetString ( R . string . reading _ behavior ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Page Records Overview ( book Id : ĠBook Id ) Ġ{ ĊĠĠĠĠĠĠĠ Ġregister For PopupMenu ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . pages Diagram View . action View , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . menu . menu _ page _ records _ details ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ page _ records _ details Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD ante Utils . add Fragment To Activity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent FragmentManager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage Records Detail Fragment . newInstance ( book Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo Back Stack Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ page _ records _ reset Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMaterial Dialog ( require Context ()). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon ( R . drawable . ic _ delete ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( text Ġ= ĠgetString ( R . string . ask _ for _ all _ page _ record _ deletion _ title )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( text Ġ= ĠgetString ( R . string . ask _ for _ all _ page _ record _ deletion _ msg )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( R . string . action _ delete ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . delete All Page Records () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( android . R . string . cancel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancel On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Radius ( App Utils . convert Dp In Pixel ( 6 , Ġrequire Context ()). toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup View Listener () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvb . btn Detail Pages . set H aptic ClickListener ( viewModel :: request Page Dialog ) ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Published . set H aptic ClickListener Ġ{ Ġshow DatePicker ( DATE _ TARGET _ PUBL ISHED _ DATE ) Ġ} ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Notes . set H aptic ClickListener ( viewModel :: request Notes Dialog ) ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Rate . set H aptic ClickListener ( viewModel :: request Rating Dialog ) ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Wish h list Date . set H aptic ClickListener Ġ{ Ġshow DatePicker ( DATE _ TARGET _ W ISH LIST _ DATE ) Ġ} ĊĠĠĠĠĠĠĠ Ġvb . btn Detail StartDate . set H aptic ClickListener Ġ{ Ġshow DatePicker ( DATE _ TARGET _ START _ DATE ) Ġ} ĊĠĠĠĠĠĠĠ Ġvb . btn Detail EndDate . set H aptic ClickListener Ġ{ Ġshow DatePicker ( DATE _ TARGET _ END _ DATE ) Ġ} ĊĠĠĠĠĠĠĠ Ġvb . btn Add Label . set H aptic ClickListener ( viewModel :: request Add Labels ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠView . set H aptic ClickListener ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . setOnClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . perform H aptic Feedback ( H aptic Feedback Constants . VIRTUAL _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Icons () Ġ{ ĊĠĠĠĠĠĠĠ ĠObservable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from Iterable ( icon Loading Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( drawable Res , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( D ante Utils . vector 2 Drawable ( require Context (), Ġdrawable Res ), Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe On ( Schedulers . computation ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe On ( Android Schedulers . main Thread ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthe Ġend Ġ( onComplete ) Ġstart Ġthe Ġcomponent Ġanimations Ġin ĠonComplete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe (:: set Compound Drawable , ĠException Handlers :: default ExceptionHandler , Ġ:: start Component Animations ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo ( composite Disposable ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Compound Drawable ( pair : ĠPair < Drawable , ĠTextView >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġ( drawable , Ġview ) Ġ= Ġpair ĊĠĠĠĠĠĠĠ Ġview . set Compound Draw ables With Intr insic Bounds ( null , Ġdrawable , Ġnull , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Component Animations () Ġ{ ĊĠĠĠĠĠĠĠ ĠAnimation Utils . detail Enter Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim atable Views List , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ 3 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Delay Ġ= Ġ 5 5 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Between Animations Ġ= Ġ 1 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠAccel erate De cel erate Interpolator (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow DatePicker ( target : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext ?. let Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcal Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDate Picker Dialog ( ctx , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġ_, Ġy , Ġm , Ġd Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( target ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDATE _ TARGET _ PUBL ISHED _ DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonUpdate Published Date ( y . toString (), Ġm . plus ( 1 ). toString (), Ġd . toString ()) Ġ// Ġ+ 1 Ġbecause Ġmonth Ġstarts Ġwith Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDATE _ TARGET _ W ISH LIST _ DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwish List Date Ġ= ĠD ante Utils . build Timestamp From Date ( y , Ġm , Ġd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . update Wish list Date ( wish List Date )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( R . string . invalid _ time _ range _ wishlist , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDATE _ TARGET _ START _ DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠstartDate Ġ= ĠD ante Utils . build Timestamp From Date ( y , Ġm , Ġd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . update StartDate ( startDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( R . string . invalid _ time _ range _ start , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDATE _ TARGET _ END _ DATE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendDate Ġ= ĠD ante Utils . build Timestamp From Date ( y , Ġm , Ġd ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . update EndDate ( endDate )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast ( R . string . invalid _ time _ range _ end , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcal . get ( Calendar . YEAR ), Ġcal . get ( Calendar . MONTH ), Ġcal . get ( Calendar . DAY _ OF _ MONTH )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Label Picker ( already Attached Labels : ĠList < Book Label >) Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLabel Picker Bottom Sheet Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. newInstance ( already Attached Labels ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setOn Label Selected Listener ( viewModel :: attach Label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( child FragmentManager , Ġ" pick - label - bottom - sheet ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Time Information ( book : ĠBook Entity ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠHide Ġcomplete Ġcard Ġif Ġno Ġtime Ġinformation Ġis Ġavailable ĊĠĠĠĠĠĠĠ Ġif Ġ(! book . is Any Time Information Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . layout Detail Dates . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ" dd . ĠM MM Ġy yyy " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠW ish list ĠDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . wishlist Date Ġ> Ġ 0 Ġ-> Ġvb . btn Detail Wish h list Date . text Ġ= ĠDateTime ( book . wishlist Date ). toString ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . state Ġ!= ĠBook State . READ _ L ATER Ġ-> Ġvb . btn Detail Wish h list Date . setText ( R . string . not _ available ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvb . btn Detail Wish h list Date . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart ĠDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . startDate Ġ> Ġ 0 Ġ-> Ġvb . btn Detail StartDate . text Ġ= ĠDateTime ( book . startDate ). toString ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . state Ġ!= ĠBook State . READ _ L ATER Ġ-> Ġvb . btn Detail StartDate . setText ( R . string . not _ available ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvb . btn Detail StartDate . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEnd ĠDate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbook . endDate Ġ> Ġ 0 Ġ-> Ġvb . btn Detail EndDate . text Ġ= ĠDateTime ( book . endDate ). toString ( pattern ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvb . btn Detail EndDate . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Page Components ( ĊĠĠĠĠĠĠĠ Ġstate : ĠBook State , ĊĠĠĠĠĠĠĠ Ġis Reading : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġhas Pages : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġpage Count : ĠInt , ĊĠĠĠĠĠĠĠ ĠcurrentPage : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBook Ġmust Ġbe Ġin Ġreading Ġstate Ġand Ġmust Ġhave Ġa Ġle git Ġpage Ġcount Ġand Ġoverall Ġthe Ġfeature ĊĠĠĠĠĠĠĠ Ġ// Ġmust Ġbe Ġenabled Ġin Ġthe Ġsettings ĊĠĠĠĠĠĠĠ Ġif Ġ( is Reading Ġ&& Ġhas Pages ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Page Progress ( currentPage , Ġpage Count ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Pages . text Ġ= Ġif Ġ( state Ġ== ĠBook State . READ ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInit ially Ġset ĠcurrentPage Ġto Ġ 0 Ġfor Ġprogress Ġanimation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . detail _ pages , ĠcurrentPage , Ġpage Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpage Count . toString () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . sb Detail Pages . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Pages . text Ġ= Ġpage Count . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Page Progress ( currentPage : ĠInt , Ġpage Count : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvb . sb Detail Pages . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= ĠcurrentPage ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxValue Ġ= Ġpage Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Callback ( this @ Book Detail Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On ValueChanged Listener Ġ{ Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . btn Detail Pages . text Ġ= ĠgetString ( R . string . detail _ pages , Ġpage , Ġpage Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Notes ( is Notes Empty : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotes Id Ġ= Ġif Ġ(! is Notes Empty ) ĠR . string . my _ notes Ġelse ĠR . string . add _ notes ĊĠĠĠĠĠĠĠ Ġvb . btn Detail Notes . text Ġ= ĠgetString ( notes Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Image ( address : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! address . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Loader . load Image With Corner Radius ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvb . iv Detail Image , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorner Dimension Ġ= Ġrequire Context (). resources . get Dimension ( R . dim en . thumbnail _ rounded _ corner ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Ġ= Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback Handle Values Ġ= ĠPair ( first Ġ= Ġfalse , Ġsecond Ġ= Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt int Edit MenuItem ( Context Compat . getColor ( require Context (), ĠR . color . d ante Accent )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvb . iv Detail Image . setImage Resource ( R . drawable . ic _ placeholder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Labels ( labels : ĠList < Book Label >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvb . ch ips Detail Label . removeAll Views () ĊĊĠĠĠĠĠĠĠ Ġlabels ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġlabel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ip Factory . build Chip View From Label ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Label Clicked Listener Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Close Icon Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Icon Click Callback Ġ= ĠviewModel :: remove Label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach ( vb . ch ips Detail Label :: addView ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonUpdate Published Date ( y : ĠString , Ġm : ĠString , Ġd : ĠString ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġm Str Ġ= Ġm . pad Start ( 2 , Ġ' 0 ') ĊĠĠĠĠĠĠĠ Ġval Ġd Str Ġ= Ġd . pad Start ( 2 , Ġ' 0 ') ĊĠĠĠĠĠĠĠ Ġval Ġpublished Date Ġ= Ġ"$ y -$ m Str -$ d Str " ĊĊĠĠĠĠĠĠĠ Ġvb . btn Detail Published . text Ġ= Ġpublished Date ĊĊĠĠĠĠĠĠĠ ĠviewModel . update Published Date ( published Date ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ BOOK _ CHANGED Ġ= Ġ" action _ book _ changed " ĊĊĠĠĠĠĠĠĠ Ġ// ĠConst Ġcallback Ġvalues Ġfor Ġtime Ġpicker ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ TARGET _ PUBL ISHED _ DATE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ TARGET _ W ISH LIST _ DATE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ TARGET _ START _ DATE Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDATE _ TARGET _ END _ DATE Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ BOOK _ ID Ġ= Ġ" arg _ book _ id " ĊĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( id : ĠBook Id ): ĠBook Detail Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBook Detail Fragment (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . arguments Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( ARG _ BOOK _ ID , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }