package Ġeu . kan ade . t ach iy omi . extension . en . to pt oon plus Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . text . InputType Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroidx . preference . CheckBox Preference Ċ import Ġandroidx . preference . EditText Preference Ċ import Ġandroidx . preference . Preference Screen Ċ import Ġeu . kan ade . t ach iy omi . annotations . N sf w Ċ import Ġeu . kan ade . t ach iy omi . lib . rate limit . RateLimit Interceptor Ċ import Ġeu . kan ade . t ach iy omi . network . GET Ċ import Ġeu . kan ade . t ach iy omi . network . POST Ċ import Ġeu . kan ade . t ach iy omi . network . as Observable Success Ċ import Ġeu . kan ade . t ach iy omi . source . Configurable Source Ċ import Ġeu . kan ade . t ach iy omi . source . model . Filter List Ċ import Ġeu . kan ade . t ach iy omi . source . model . M ang as Page Ċ import Ġeu . kan ade . t ach iy omi . source . model . Page Ċ import Ġeu . kan ade . t ach iy omi . source . model . S Chapter Ċ import Ġeu . kan ade . t ach iy omi . source . model . SM anga Ċ import Ġeu . kan ade . t ach iy omi . source . online . Http Source Ċ import Ġkotlinx . serialization . decode FromString Ċ import Ġkotlinx . serialization . json . Json Ċ import Ġkotlinx . serialization . json . build JsonObject Ċ import Ġkotlinx . serialization . json . put Ċ import Ġokhttp 3 . Cache Control Ċ import Ġokhttp 3 . Headers Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġokhttp 3 . Response Ċ import Ġrx . Observable Ċ import Ġu y . ko hes ive . in jekt . In jekt Ċ import Ġu y . ko hes ive . in jekt . api . get Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ import Ġjava . io . IOException Ċ import Ġjava . text . ParseException Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . Locale Ċ import Ġjava . util . UUID Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ N sf w Ċ class ĠTop To on Plus Ġ: ĠHttp Source (), ĠConfigur able Source Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġname Ġ= Ġ" TOP TO ON +" ĊĊĠĠĠ Ġoverride Ġval ĠbaseUrl Ġ= Ġ" https :// to pt oon plus . com " ĊĊĠĠĠ Ġoverride Ġval Ġlang Ġ= Ġ" en " ĊĊĠĠĠ Ġoverride Ġval Ġsupports Latest Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġval Ġclient : ĠOk HttpClient Ġ= Ġnetwork . cloudflare Client . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. add Interceptor (:: auth Intercept ) ĊĠĠĠĠĠĠĠ Ġ. add Interceptor ( RateLimit Interceptor ( 2 , Ġ 1 , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġval Ġjson : ĠJson Ġby Ġinject Lazy () ĊĊĠĠĠ Ġprivate Ġval Ġday : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get DisplayName ( Calendar . DAY _ OF _ WEEK , ĠCalendar . SHORT , ĠLocale . US ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toUpperCase ( Locale . US ) ĊĊĠĠĠ Ġprivate Ġval Ġpreferences : ĠSharedPreferences Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠIn jekt . get < Application >(). get SharedPreferences (" source _$ id ", Ġ 0 x 0 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġemail : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpreferences . getString ( EMAIL _ PRE F _ KEY , Ġ"") !! ĊĊĠĠĠ Ġprivate Ġval Ġpassword : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpreferences . getString ( PASSWORD _ PRE F _ KEY , Ġ"") !! ĊĊĠĠĠ Ġprivate Ġval Ġshow M ature Titles : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġpreferences . getBoolean ( M ATURE _ PRE F _ KEY , Ġfalse ) ĊĊĠĠĠ Ġprivate Ġval ĠdeviceId : ĠString Ġby Ġlazy Ġ{ ĠUUID . randomUUID (). toString () Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtoken : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġuser M ature : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġheaders Builder (): ĠHeaders . Builder Ġ= ĠHeaders . Builder () ĊĠĠĠĠĠĠĠ Ġ. add (" Origin ", ĠbaseUrl ) ĊĠĠĠĠĠĠĠ Ġ. add (" Refer er ", Ġ"$ baseUrl /") ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ API _ URL / api / v 1 / page / ranking ", Ġnew Headers , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpopular M anga Parse ( response : ĠResponse ): ĠM ang as Page Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Ranking >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( emptyList (), Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic List Ġ= Ġresult . data . ranking . map (:: popular M anga From Object ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( com ic List , Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpopular M anga From Object ( com ic : ĠTop To on Com ic ) Ġ= ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcom ic . information ?. title . or Empty () ĊĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġcom ic . thumbnail Image ?. jpeg ?. first OrNull ()?. path . or Empty () ĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"/ com ic /${ com ic . com ic Id }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Request ( page : ĠInt ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ API _ URL / api / v 1 / page / daily /$ day ", Ġnew Headers , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlatest Updates Parse ( response : ĠResponse ): ĠM ang as Page Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Daily >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( emptyList (), Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic List Ġ= Ġresult . data . daily . map (:: latest M anga From Object ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( com ic List , Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlatest M anga From Object ( com ic : ĠTop To on Com ic ) Ġ= Ġpopular M anga From Object ( com ic ) ĊĊĠĠĠ Ġoverride Ġfun Ġfetch Search M anga ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠObservable < M ang as Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . fetch Search M anga ( page , Ġquery , Ġfilters ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter edList Ġ= Ġresult . m ang as . filter Ġ{ Ġit . title . contains ( query , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM ang as Page ( filter edList , Ġresult . hasNext Page ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Request ( page : ĠInt , Ġquery : ĠString , Ġfilters : ĠFilter List ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Language ", Ġlang ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" M ature ", Ġif Ġ( show M ature Titles ) Ġ" 1 " Ġelse Ġ" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ API _ URL / api / v 1 / search / tot alse arch ", Ġnew Headers , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch M anga Parse ( response : ĠResponse ): ĠM ang as Page Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response . request . url . toString (). contains (" ranking ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpopular M anga Parse ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < List < Top To on Com ic >> >( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( emptyList (), Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic List Ġ= Ġresult . data . map (:: search M anga From Object ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠM ang as Page ( com ic List , Ġhas Next Page Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsearch M anga From Object ( com ic : ĠTop To on Com ic ) Ġ= Ġpopular M anga From Object ( com ic ) ĊĊĠĠĠ Ġ// ĠWork around Ġto Ġallow Ġ" Open Ġin Ġbrowser " Ġuse Ġthe Ġreal ĠURL . ĊĠĠĠ Ġoverride Ġfun Ġfetch M anga Details ( manga : ĠSM anga ): ĠObservable < SM anga > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( manga Details ApiRequest ( manga . url )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Observable Success () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm anga Details Parse ( response ). apply Ġ{ Ġinitialized Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġm anga Details ApiRequest ( manga Url : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic Id Ġ= Ġm anga Url . substring After Last ("/") ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ("$ API _ URL / api / v 1 / page / episode ? com ic Id =$ com ic Id ", Ġnew Headers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Request ( manga : ĠSM anga ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. removeAll (" Accept ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( baseUrl Ġ+ Ġm anga . url , Ġnew Headers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġm anga Details Parse ( response : ĠResponse ): ĠSM anga Ġ= ĠSM anga . create (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Details >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( CO ULD _ NOT _ PARSE _ RESPONSE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic Ġ= Ġresult . data . com ic !! ĊĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġcom ic . information ?. title . or Empty () ĊĠĠĠĠĠĠĠ Ġthumbnail _ url Ġ= Ġcom ic . thumbnail Image ?. jpeg ?. first OrNull ()?. path . or Empty () ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġcom ic . information ?. description ĊĠĠĠĠĠĠĠ Ġstatus Ġ= ĠSM anga . ONGO ING ĊĠĠĠĠĠĠĠ Ġauthor Ġ= Ġcom ic . author . join ToString (", Ġ") Ġ{ Ġit . trim () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Request ( manga : ĠSM anga ): ĠRequest Ġ= Ġm anga Details ApiRequest ( manga . url ) ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Parse ( response : ĠResponse ): ĠList < S Chapter > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Details >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( CO ULD _ NOT _ PARSE _ RESPONSE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . data . episode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġepisode Ġ-> Ġepisode . information ?. pay Type Ġ== Ġ 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: chapter From Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchapter From Object ( chapter : ĠTop To on Episode ): ĠS Chapter Ġ= ĠS Chapter . create (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġchapter . information ?. title . or Empty () Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( chapter . information ?. sub Title . isNull OrEmpty (). not ()) Ġ" Ġ- Ġ" Ġ+ Ġchapter . information ?. sub Title Ġelse Ġ"") ĊĠĠĠĠĠĠĠ Ġchapter _ number Ġ= Ġchapter . order . toFloat () ĊĠĠĠĠĠĠĠ Ġscan lator Ġ= Ġthis @ Top To on Plus . name ĊĠĠĠĠĠĠĠ Ġdate _ upload Ġ= Ġchapter . information ?. published At ?. date . or Empty (). toDate () ĊĠĠĠĠĠĠĠ Ġurl Ġ= Ġ"/ com ic /${ chapter . com ic Id }/${ chapter . episode Id }" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Request ( chapter : ĠS Chapter ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Language ", Ġ" en ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Token ", Ġtoken . or Empty (). if Empty Ġ{ Ġ" null " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġcom ic Id Ġ= Ġchapter . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After ("/ com ic /") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before ("/") ĊĠĠĠĠĠĠĠ Ġval Ġepisode Id Ġ= Ġchapter . url . substring After Last ("/") ĊĊĠĠĠĠĠĠĠ Ġval Ġapi Url Ġ= Ġ"$ API _ URL / check / is Us able Episode ". to Http Url (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" com ic Id ", Ġcom ic Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" episode Id ", Ġepisode Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" location ", Ġ" episode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add QueryParameter (" action ", Ġ" episode _ click ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( api Url , Ġnew Headers , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( response : ĠResponse ): ĠList < Page > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Us able Episode >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( CO ULD _ NOT _ PARSE _ RESPONSE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġusable Episode Ġ= Ġresult . data ĊĊĠĠĠĠĠĠĠ Ġif Ġ( usable Episode . is Free . not () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusable Episode . episode Price ?. pay Type Ġ!= Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusable Episode . purchase Method . first OrNull () Ġ!= Ġ" FREE _ E PI SO DE " ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException ( CH AP TER _ NOT _ FREE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġusable Episode . episode !!. content Image ?. jpeg . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġi , Ġpage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPage ( i , ĠbaseUrl , Ġpage . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfetch ImageUrl ( page : ĠPage ): ĠObservable < String > Ġ= ĠObservable . just ( page . imageUrl !! ) ĊĊĠĠĠ Ġoverride Ġfun ĠimageUrl Parse ( response : ĠResponse ): ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġoverride Ġfun Ġimage Request ( page : ĠPage ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" Accept ", ĠAC CEPT _ IMAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set (" Refer er ", Ġpage . url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( page . imageUrl !! , Ġnew Headers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Preference Screen ( screen : ĠPreference Screen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġemail Pref Ġ= ĠEditText Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠE MAIL _ PRE F _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠE MAIL _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DefaultValue ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Ġ= ĠE MAIL _ PRE F _ SUM MARY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Title Ġ= ĠE MAIL _ PRE F _ TITLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( EMAIL _ PRE F _ KEY , ĠnewValue Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpassword Pref Ġ= ĠEditText Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠPASSWORD _ PRE F _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠPASSWORD _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DefaultValue ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Ġ= ĠPASSWORD _ PRE F _ SUM MARY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog Title Ġ= ĠPASSWORD _ PRE F _ TITLE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Bind EditText Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . input Type Ġ= ĠInput Type . TYPE _ CLASS _ TEXT Ġor ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putString ( PASSWORD _ PRE F _ KEY , ĠnewValue Ġas ĠString ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġm ature Pref Ġ= ĠCheckBox Preference ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= ĠM ATURE _ PRE F _ KEY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠM ATURE _ PRE F _ TITLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DefaultValue ( M ATURE _ PRE F _ DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Ġ= ĠM ATURE _ PRE F _ SUM MARY ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ChangeListener Ġ{ Ġ_, ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put Boolean ( M ATURE _ PRE F _ KEY , ĠnewValue Ġas ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġscreen . add Preference ( email Pref ) ĊĠĠĠĠĠĠĠ Ġscreen . add Preference ( password Pref ) ĊĠĠĠĠĠĠĠ Ġscreen . add Preference ( m ature Pref ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġauth Intercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Api Call Ġ= Ġchain . request (). url . toString (). contains ( API _ URL ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Api Call Ġ&& Ġemail . isNotBlank () Ġ&& Ġpassword . isNotBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogin Request Ġ= Ġlogin Request ( email , Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogin Response Ġ= Ġchain . proceed ( login Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġlogin Parse ( login Response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Response . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user M ature Ġ!= Ġshow M ature Titles Ġ&& Ġtoken Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPreference Ġtakes Ġprecedence Ġover Ġwebsite . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm ature Request Ġ= Ġm ature Request ( token !! , Ġshow M ature Titles ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm ature Response Ġ= Ġchain . proceed ( m ature Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser M ature Ġ= Ġshow M ature Titles ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm ature Response . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Request Ġ= Ġchain . request (). newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. remove Header (" Token ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Header (" Token ", Ġtoken . or Empty (). if Empty Ġ{ Ġ" null " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( new Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( chain . request ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogin Request ( email : ĠString , Ġpassword : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Payload Ġ= Ġbuild JsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" auth ", Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" deviceId ", ĠdeviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" is 1 7 ", Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" password ", Ġpassword ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" userId ", Ġemail ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġrequest Payload . toString (). to RequestBody ( JSON _ MEDIA _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Content - Length ", Ġrequest Body . content Length (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Content - Type ", Ġrequest Body . contentType (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPOST ("$ API _ URL / auth / generate Token ", Ġnew Headers , Ġrequest Body , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlogin Parse ( response : ĠResponse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( response . code Ġ!= Ġ 2 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( CO ULD _ NOT _ LOGIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġjson . decode FromString < Top To on Result < Top To on Auth >>( response . body !!. string ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result . data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( CO ULD _ NOT _ LOGIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġuser M ature Ġ= Ġresult . data . m ature Ġ== Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult . data . token ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġm ature Request ( token : ĠString , Ġm ature : ĠBoolean ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Payload Ġ= Ġbuild JsonObject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" m ature ", Ġif Ġ( m ature ) Ġ 1 Ġelse Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġrequest Payload . toString (). to RequestBody ( JSON _ MEDIA _ TYPE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Headers Ġ= Ġheaders Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Accept ", ĠAC CEPT _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Content - Length ", Ġrequest Body . content Length (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Content - Type ", Ġrequest Body . contentType (). toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Token ", Ġtoken ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" Uuid ", ĠdeviceId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add (" X - Api - Key ", ĠAPI _ KEY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPOST ("$ API _ URL / users / setUser ", Ġnew Headers , Ġrequest Body , ĠCache Control . FORCE _ NETWORK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . toDate (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDATE _ FORMAT TER . parse ( this )?. time Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠParseException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAPI _ URL Ġ= Ġ" https :// api . to pt oon plus . com " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAPI _ KEY Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . decode (" U 1 V QR VJ DT 0 9 MQ VB JS 0 V Z Mj Ay MS NA I yg =", ĠBase 6 4 . DEFAULT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( charset (" UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAC CEPT _ JSON Ġ= Ġ" application / json , Ġtext / plain , Ġ*/ *" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAC CEPT _ IMAGE Ġ= Ġ" image / av if , image / webp , image / ap ng , image /* ,* /* ; q = 0 . 8 " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠJSON _ MEDIA _ TYPE Ġ= Ġ" application / json ; Ġcharset = UTF - 8 ". to MediaType () ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCO ULD _ NOT _ PARSE _ RESPONSE Ġ= Ġ" Could Ġnot Ġparse Ġthe ĠAPI Ġresponse ." ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCO ULD _ NOT _ LOGIN Ġ= Ġ" The Ġe - mail Ġor Ġpassword Ġprovided Ġare Ġincorrect ." ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCH AP TER _ NOT _ FREE Ġ= Ġ" This Ġchapter Ġis Ġnot Ġfree Ġto Ġread ." ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠE MAIL _ PRE F _ KEY Ġ= Ġ" email " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠE MAIL _ PRE F _ TITLE Ġ= Ġ" E - mail " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠE MAIL _ PRE F _ SUM MARY Ġ= Ġ" Define Ġhere Ġthe Ġe - mail Ġof Ġyour Ġexisting Ġaccount ." ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPASSWORD _ PRE F _ KEY Ġ= Ġ" password " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPASSWORD _ PRE F _ TITLE Ġ= Ġ" Password " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPASSWORD _ PRE F _ SUM MARY Ġ= Ġ" Define Ġhere Ġyour Ġaccount Ġpassword ." ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ATURE _ PRE F _ KEY Ġ= Ġ" m ature " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ATURE _ PRE F _ TITLE Ġ= Ġ" Show Ġm ature Ġtitles " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ATURE _ PRE F _ SUM MARY Ġ= Ġ" This Ġsetting Ġonly Ġtakes Ġeffect Ġif Ġyou Ġare Ġsigned Ġin ." ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠM ATURE _ PRE F _ DEFAULT Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDATE _ FORMAT TER Ġby Ġlazy Ġ{ ĠSimpleDateFormat (" yyyy - MM - dd ", ĠLocale . EN GL ISH ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ