package Ġeu . kan ade . t ach iy omi . extension . ja . gan ma Ċ Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . preference . Preference Screen Ċ import Ġandroidx . preference . Switch Preference Compat Ċ 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 . 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 Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . json . json Primitive Ċ import Ġokhttp 3 . Cookie Ċ import Ġokhttp 3 . Cookie Jar Ċ import Ġokhttp 3 . Form Body Ċ import Ġokhttp 3 . Headers Ċ import Ġokhttp 3 . Http Url Ċ import Ġokhttp 3 . Http Url . Companion . to Http Url Ċ import Ġokhttp 3 . Request Ċ import Ġokhttp 3 . Response Ċ Ċ class ĠG an ma App ( private Ġval Ġmetadata : ĠMetadata ) Ġ: ĠG an ma () Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġclient Ġ= Ġnetwork . client . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. cookie Jar ( Cookies ( metadata . baseUrl . to Http Url (). host , Ġmetadata . cookie Name )) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġval Ġapp Headers : ĠHeaders Ġ= ĠHeaders . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd (" User - Agent ", Ġmetadata . userAgent ) ĊĠĠĠĠĠĠĠ Ġadd (" X - From ", Ġmetadata . baseUrl ) ĊĠĠĠ Ġ}. build () ĊĊĠĠĠ Ġoverride Ġfun Ġchapter List Request ( manga : ĠSM anga ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Session () ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( metadata . baseUrl Ġ+ ĠString . format ( metadata . mag azine Url , Ġm anga . url . manga Id ()), Ġapp Headers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠList < S Chapter >. sorted Descending () Ġ= Ġthis ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Request ( chapter : ĠS Chapter ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Session () ĊĠĠĠĠĠĠĠ Ġval Ġ( manga Id , Ġchapter Id ) Ġ= Ġchapter . url . chapter Dir () ĊĠĠĠĠĠĠĠ Ġreturn ĠGET ( metadata . baseUrl Ġ+ ĠString . format ( metadata . story Url , Ġm anga Id , Ġchapter Id ), Ġapp Headers ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpage List Parse ( chapter : ĠS Chapter , Ġresponse : ĠResponse ): ĠList < Page > Ġ= ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . parse As < App Story >(). to Page List () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Chapter Ġnot Ġavailable !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Session () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpiration Ġ= Ġpreferences . getLong ( SESSION _ EXPI RATION _ PRE F , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( System . currentTimeMillis () Ġ+ Ġ 6 0 Ġ* Ġ 1 0 0 0 Ġ<= Ġexpiration ) Ġreturn Ġ// Ġat Ġleast Ġ 1 Ġminute ĊĠĠĠĠĠĠĠ Ġvar Ġfield 1 Ġ= Ġpreferences . getString ( TOKEN _ FIELD 1 _ PRE F , Ġ"") !! ĊĠĠĠĠĠĠĠ Ġvar Ġfield 2 Ġ= Ġpreferences . getString ( TOKEN _ FIELD 2 _ PRE F , Ġ"") !! ĊĠĠĠĠĠĠĠ Ġif Ġ( field 1 . isEmpty () Ġ|| Ġfield 2 . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( POST ( metadata . baseUrl Ġ+ Ġmetadata . token Url , Ġapp Headers )). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken : ĠJsonObject Ġ= Ġresponse . parse As () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield 1 Ġ= Ġtoken [ metadata . token Field 1 ] !!. json Primitive . content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield 2 Ġ= Ġtoken [ metadata . token Field 2 ] !!. json Primitive . content ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= ĠForm Body . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( metadata . token Field 1 , Ġfield 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( metadata . token Field 2 , Ġfield 2 ) ĊĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġclient . new Call ( POST ( metadata . baseUrl Ġ+ Ġmetadata . session Url , Ġapp Headers , Ġrequest Body )). execute () ĊĠĠĠĠĠĠĠ Ġval Ġsession : ĠSession Ġ= Ġresponse . parse As () ĊĠĠĠĠĠĠĠ Ġpreferences . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( TOKEN _ FIELD 1 _ PRE F , Ġfield 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( TOKEN _ FIELD 2 _ PRE F , Ġfield 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( SESSION _ EXPI RATION _ PRE F , Ġsession . expire ) ĊĠĠĠĠĠĠĠ Ġ}. apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear Session ( clear Token : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreferences . edit (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( SESSION _ PRE F , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Long ( SESSION _ EXPI RATION _ PRE F , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( clear Token ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( TOKEN _ FIELD 1 _ PRE F , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput String ( TOKEN _ FIELD 2 _ PRE F , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsetup Preference Screen ( screen : ĠPreference Screen ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setup Preference Screen ( screen ) ĊĠĠĠĠĠĠĠ ĠSwitch Preference Compat ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Clear Ġsession " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Session ( clear Token Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( screen . context , Ġ" Session Ġcleared ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġscreen . add Preference ( it ) Ġ} ĊĠĠĠĠĠĠĠ ĠSwitch Preference Compat ( screen . context ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" Clear Ġtoken " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Preference ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Session ( clear Token Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( screen . context , Ġ" Token Ġcleared ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġscreen . add Preference ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠCookies ( private Ġval Ġhost : ĠString , Ġprivate Ġval Ġname : ĠString ) Ġ: ĠCookie Jar Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġload For Request ( url : ĠHttp Url ): ĠList < Cookie > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . host Ġ!= Ġhost ) Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcookie Ġ= ĠCookie . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ( preferences . getString ( SESSION _ PRE F , Ġ"") !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain ( host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( cookie ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsave From Response ( url : ĠHttp Url , Ġcookies : ĠList < Cookie >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . host Ġ!= Ġhost ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cookie Ġin Ġcookies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cookie . name Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreferences . edit (). putString ( SESSION _ PRE F , Ġcookie . value ). apply () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTOKEN _ FIELD 1 _ PRE F Ġ= Ġ" TOKEN _ FIELD 1 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTOKEN _ FIELD 2 _ PRE F Ġ= Ġ" TOKEN _ FIELD 2 " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSESSION _ PRE F Ġ= Ġ" SESSION " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSESSION _ EXPI RATION _ PRE F Ġ= Ġ" SESSION _ EXPI RATION " ĊĠĠĠ Ġ} Ċ } Ċ