package Ġio . github . g math i . no vel library . service . tts Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Pending Intent Ċ import Ġandroid . app . Service Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . IB inder Ċ import Ġandroid . os . Looper Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . speech . tts . Ut ter ance Progress Listener Ċ import Ġandroid . support . v 4 . media . Media Metadata Compat Ċ import Ġandroid . support . v 4 . media . session . Media Controller Compat Ċ import Ġandroid . support . v 4 . media . session . Media Session Compat Ċ import Ġandroid . support . v 4 . media . session . Playback State Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . app . Notification Manager Compat Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . bump tech . glide . request . target . Custom Target Ċ import Ġcom . bump tech . glide . request . transition . Transition Ċ import Ġio . github . g math i . no vel library . clean er . Html Clean er Ċ import Ġio . github . g math i . no vel library . database .* Ċ import Ġio . github . g math i . no vel library . model . database . No vel Ċ import Ġio . github . g math i . no vel library . model . database . Web Page Settings Ċ import Ġio . github . g math i . no vel library . network . GET Ċ import Ġio . github . g math i . no vel library . network . Host Names Ċ import Ġio . github . g math i . no vel library . network . Network Helper Ċ import Ġio . github . g math i . no vel library . service . tts . TT S Notification Builder . Companion . TT S _ NOTIFICATION _ ID Ċ import Ġio . github . g math i . no vel library . util . Constants . FILE _ PROTOCOL Ċ import Ġio . github . g math i . no vel library . util . Data Center Ċ import Ġio . github . g math i . no vel library . util . Logs Ċ import Ġio . github . g math i . no vel library . util . Utils . get Formatted Text Ċ import Ġio . github . g math i . no vel library . util . lang . album Art Ċ import Ġio . github . g math i . no vel library . util . lang . display Subtitle Ċ import Ġio . github . g math i . no vel library . util . lang . display Title Ċ import Ġio . github . g math i . no vel library . util . lang . get G lide Url Ċ import Ġio . github . g math i . no vel library . util . network . as J soup Ċ import Ġio . github . g math i . no vel library . util . network . safe Execute Ċ import Ġkotlinx . coroutines .* Ċ import Ġokhttp 3 . Ok HttpClient Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . nodes . Document Ċ import Ġu y . ko hes ive . in jekt . inject Lazy Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap ĊĊ Ċ class ĠT TS Service Ġ: ĠService (), ĠText ToS peech . OnInit Listener Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG Ġ= Ġ" TT S Service " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠA UDIO _ TEXT _ KEY Ġ= Ġ" audio Text Key " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTITLE Ġ= Ġ" title " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNO VEL _ ID Ġ= Ġ" no vel Id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTRAN SL ATOR _ SOURCE _ NAME Ġ= Ġ" translator Source Name " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCH AP TER _ INDEX Ġ= Ġ" chapter Index " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ STOP Ġ= Ġ" action Stop " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ PAUSE Ġ= Ġ" action Pause " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ PLAY Ġ= Ġ" action Play " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ NEXT Ġ= Ġ" action Next " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ PREVIOUS Ġ= Ġ" action Previous " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġdata Center : ĠData Center Ġby Ġinject Lazy () ĊĠĠĠ Ġprivate Ġval Ġnetwork Helper : ĠNetwork Helper Ġby Ġinject Lazy () ĊĠĠĠ Ġprivate Ġval Ġclient : ĠOk HttpClient ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnetwork Helper . cloudflare Client ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġt ts : ĠText ToS peech ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Session : ĠMedia Session Compat ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmedia Controller : ĠMedia Controller Compat ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġt ts Notification Builder : ĠT TS Notification Builder ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotification Manager : ĠNotification Manager Compat ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdb Helper : ĠDB Helper ĊĊĠĠĠ Ġprivate Ġvar Ġblocking Job : ĠJob ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnovel : ĠNo vel ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtranslator Source Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġaudio Text : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtitle : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchapter Index : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġlines : ĠArrayList < String > Ġ= ĠArrayList () ĊĠĠĠ Ġprivate Ġvar ĠlineNumber : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġis Foreground Service : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġmetadata Compat Ġ= ĠMedia Metadata Compat . Builder () ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Unspecified Immutable Flag ") ĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġ// android . os . Debug . waitFor Debugger () ĊĊĠĠĠĠĠĠĠ Ġ// ĠBuild Ġa ĠPending Intent Ġthat Ġcan Ġbe Ġused Ġto Ġlaunch Ġthe ĠUI . ĊĠĠĠĠĠĠĠ Ġval Ġsession Activity Pending Intent Ġ= ĠPending Intent . getActivity ( this , Ġ 0 , ĠIntent (), Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġnew ĠMedia Session . ĊĠĠĠĠĠĠĠ Ġmedia Session Ġ= ĠMedia Session Compat ( this , Ġ" No vel TT S Service ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Session Activity ( session Activity Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisActive Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmedia Controller Ġ= ĠMedia Controller Compat ( this , Ġmedia Session ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . register Callback ( Media Controller Callback ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpending Intent s Ġ= ĠHashMap < String , ĠPending Intent >() ĊĠĠĠĠĠĠĠ Ġpending Intent s [ ACTION _ PLAY ] Ġ= Ġcreate Pending Intent ( ACTION _ PLAY ) ĊĠĠĠĠĠĠĠ Ġpending Intent s [ ACTION _ PAUSE ] Ġ= Ġcreate Pending Intent ( ACTION _ PAUSE ) ĊĠĠĠĠĠĠĠ Ġpending Intent s [ ACTION _ STOP ] Ġ= Ġcreate Pending Intent ( ACTION _ STOP ) ĊĠĠĠĠĠĠĠ Ġpending Intent s [ ACTION _ NEXT ] Ġ= Ġcreate Pending Intent ( ACTION _ NEXT ) ĊĠĠĠĠĠĠĠ Ġpending Intent s [ ACTION _ PREVIOUS ] Ġ= Ġcreate Pending Intent ( ACTION _ PREVIOUS ) ĊĊĠĠĠĠĠĠĠ Ġt ts Notification Builder Ġ= ĠT TS Notification Builder ( this , Ġpending Intent s ) ĊĠĠĠĠĠĠĠ Ġnotification Manager Ġ= ĠNotification Manager Compat . from ( this ) ĊĊĠĠĠĠĠĠĠ Ġdb Helper Ġ= ĠDB Helper . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġt ts Ġ= ĠText ToS peech ( this , Ġthis ) ĊĠĠĠĠĠĠĠ Ġt ts . setOn Ut ter ance Progress Listener ( object Ġ: ĠUt ter ance Progress Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Done ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutter ance Id ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ== Ġ" KEEP _ READ ING ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineNumber ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeak N ex Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( utter ance Id Ġ== Ġ" STOP _ READ ING ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Do ĠNothing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" On Start Command ") ĊĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġintent ?. action ĊĊĠĠĠĠĠĠĠ Ġ// If Ġcalled Ġfrom ĠNotification ĠActions Ġlike Ġplay , Ġpause , Ġe . t . c . ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Media Controller Actions ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// If Ġcalled Ġfrom Ġactivity ĊĠĠĠĠĠĠĠ Ġval Ġnovel Id Ġ= Ġintent ?. extras ?. getLong ( NO VEL _ ID , Ġ- 1 L ) Ġ?: Ġ- 1 L ĊĠĠĠĠĠĠĠ Ġnovel Ġ= Ġdb Helper . get No vel ( no vel Id ) ĊĠĠĠĠĠĠĠ Ġnovel ?. let Ġ{ Ġset Chapter Index ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġaudio Text Ġ= Ġintent ?. extras ?. getString ( AUDIO _ TEXT _ KEY , Ġnull ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġintent ?. extras ?. getString ( TITLE , Ġnull ) Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġtranslator Source Name Ġ= Ġintent ?. extras ?. getString ( TRANSL ATOR _ SOURCE _ NAME ) ĊĠĠĠĠĠĠĠ Ġchapter Index Ġ= Ġintent ?. extras ?. getInt ( CH AP TER _ INDEX , Ġ 0 ) Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġmetadata Compat . display Title Ġ= Ġnovel ?. name Ġ?: Ġ" No vel ĠName ĠNot ĠFound " ĊĠĠĠĠĠĠĠ Ġmetadata Compat . display Subtitle Ġ= Ġtitle ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! no vel ?. imageUrl . isNull Or Blank () Ġ&& Ġnetwork Helper . isConnected To Network ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG lide . with ( this ). as Bitmap (). load ( no vel !!. imageUrl !!. get G lide Url ()). into ( object Ġ: ĠCustom Target < Bitmap >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Resource Ready ( resource : ĠBitmap , Ġtransition : ĠTransition < in ĠBitmap > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Compat . album Art Ġ= Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( metadata Compat . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonLoad Cle ared ( placeholder : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( metadata Compat . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . onStart Command ( intent , Ġflags , Ġstart Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchoose Media Controller Actions ( action : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" TT S ĠAction : Ġ$ action ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ PLAY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeak N ex Line () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( Playback State Compat . Builder (). setState ( Playback State Compat . STATE _ PLAY ING , Ġ 1 L , Ġ 1 F ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ PAUSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend To TT S ("", ĠText ToS peech . QUEUE _ FLUSH , Ġ" STOP _ READ ING ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( Playback State Compat . Builder (). setState ( Playback State Compat . STATE _ PA USED , Ġ 1 L , Ġ 1 F ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ STOP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsend To TT S ("", ĠText ToS peech . QUEUE _ FLUSH , Ġ" STOP _ COMPLETE LY ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( Playback State Compat . Builder (). setState ( Playback State Compat . STATE _ NONE , Ġ 1 L , Ġ 1 F ). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ NEXT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chapter Index Ġ== Ġ( no vel !!. chapter s Count Ġ- Ġ 1 ). toInt ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" No ĠMore ĠChapter s . ĠYou Ġare Ġup - to - date !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠACTION _ PREVIOUS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( chapter Index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" First ĠChapter ! ĠCannot Ġgo Ġback !", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchapter Index -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Init ( status : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠText ToS peech . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġt ts . set Language ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== ĠText ToS peech . LANG _ MISSING _ DATA Ġ|| Ġresult Ġ== ĠText ToS peech . LANG _ NOT _ SUPPORTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" English Ġlanguage Ġis Ġnot Ġavailable .", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Could Ġnot Ġinitialize ĠText ToS peech .", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Reading () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Stop Ġreading ĊĠĠĠĠĠĠĠ Ġsend To TT S ("", ĠText ToS peech . QUEUE _ FLUSH ) ĊĊĠĠĠĠĠĠĠ Ġ// Reset Ġold Ġdata ĊĠĠĠĠĠĠĠ Ġlines . clear () ĊĠĠĠĠĠĠĠ ĠlineNumber Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġextracted Lines : ĠArrayList < String > Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠ Ġaudio Text ?. split ("\ n ") ?. filter Ġ{ Ġit . isNotEmpty () Ġ} ?. map To ( extract ed Lines ) Ġ{ Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcharacter Limit Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġextracted Lines . forEach Ġ{ Ġextracted Line Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġline Ġlength Ġis Ġless Ġthan Ġ` character Limit ` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extract ed Line . length Ġ< Ġcharacter Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( extract ed Line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Break Ġa Ġsingle Ġbig Ġline Ġin Ġto Ġmultiple Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline To Break Ġ= Ġextracted Line . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( lineTo Break . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġline To Break . indexOf (".") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ!= Ġ- 1 Ġ&& Ġindex Ġ< Ġcharacter Limit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġline To Break . indexOf (".", ĠstartIndex Ġ= Ġindex Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( lineTo Break ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( lineTo Break . substring ( 0 , Ġindex Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline To Break Ġ= Ġline To Break . substring ( index Ġ+ Ġ 1 , Ġline To Break . length ). trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ ĠTesting ĠOnly Ġ- ĠAuto ĠNext ĠChapter Ċ // ĠĠĠĠĠĠĠ Ġval Ġtemp Array Ġ= Ġaudio Text ?. split ("\ n ") Ġ?: Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. 1 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġlines . add ( temp Array [ x ]) Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Set Ġnew Ġdata Ġ& Ġstart Ġreading ĊĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( Playback State Compat . Builder (). setState ( Playback State Compat . STATE _ PLAY ING , Ġ 1 L , Ġ 1 F ). build ()) ĊĠĠĠĠĠĠĠ Ġspeak N ex Line () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġspeak N ex Line () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lines . isNotEmpty () Ġ&& ĠlineNumber Ġ< Ġlines . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend To TT S ( lines [ line Number ], ĠText ToS peech . QUEUE _ ADD , Ġ" KEEP _ READ ING ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Center . read A loud Next Chapter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Media Controller Actions ( ACTION _ NEXT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Playback State ( Playback State Compat . Builder (). setState ( Playback State Compat . STATE _ NONE , Ġ 1 L , Ġ 1 F ). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġprivate Ġfun Ġsend To TT S ( text : ĠString , Ġqueue Mode : ĠInt , Ġutter ance Id : ĠString Ġ= Ġ" DO _ NOTH ING ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġparams . putString ( Text ToS peech . Engine . KEY _ PARAM _ UT TER ANCE _ ID , Ġutter ance Id ) Ġ// ĠDefine Ġif Ġyou Ġneed Ġit ĊĠĠĠĠĠĠĠ Ġt ts . speak ( text , Ġqueue Mode , Ġparams , Ġutter ance Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Unspecified Immutable Flag ") ĊĠĠĠ Ġprivate Ġfun Ġcreate Pending Intent ( action : ĠString ): ĠPending Intent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Intent Ġ= ĠIntent ( this , ĠT TS Service :: class . java ) ĊĠĠĠĠĠĠĠ Ġaction Intent . action Ġ= Ġaction ĊĠĠĠĠĠĠĠ Ġreturn ĠPending Intent . getService ( this , Ġ 0 , Ġaction Intent , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠMedia Controller Callback Ġ: ĠMedia Controller Compat . Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Metadata Changed ( metadata : ĠMedia Metadata Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// media Controller . playback State ?. let Ġ{ Ġupdate Notification ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" MetaData ĠChanged : Ġ$ metadata ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Playback StateChanged ( state : ĠPlay back State Compat ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. let Ġ{ Ġupdate Notification ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" State ĠChanged : Ġ$ state ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Notification ( state : ĠPlay back State Compat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated State Ġ= Ġstate . state ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( media Controller . metadata Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSkip Ġbuilding Ġa Ġnotification Ġwhen Ġstate Ġis Ġ" none ". ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġif Ġ( updated State Ġ!= ĠPlay back State Compat . STATE _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Notification Builder . build Notification ( media Session . session Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( updated State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ BUFFER ING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlay back State Compat . STATE _ PLAY ING Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Foreground Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// start Service ( Intent ( application Context , Ġthis @ TT S Service . java Class )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Foreground ( TT S _ NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Foreground Service Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( notification Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( TT S _ NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Foreground Service ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Foreground Service Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġplayback Ġhas Ġended , Ġalso Ġstop Ġthe Ġservice . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updated State Ġ== ĠPlay back State Compat . STATE _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts . shutdown () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( notification Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotification Manager . notify ( TT S _ NOTIFICATION _ ID , Ġnotification ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Helper Ġfunctions ĊĠĠĠ Ġprivate Ġfun Ġset Chapter Index ( no vel : ĠNo vel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweb Page Ġ= Ġif Ġ( no vel . current Chapter Url Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Helper . get Web Page ( no vel . current Chapter Url !! ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb Helper . get Web Page ( no vel . id , Ġtranslator Source Name , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( web Page ?. url Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġchapter Index Ġ= Ġdb Helper . getAll Web Pages ( no vel . id , Ġtranslator Source Name ). indexOf First Ġ{ Ġit . url Ġ== Ġweb Page . url Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Audio Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġweb Page Ġ= Ġdb Helper . get Web Page ( no vel !!. id , Ġtranslator Source Name , Ġchapter Index ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġweb Page . chapter Name ĊĠĠĠĠĠĠĠ Ġmetadata Compat . display Subtitle Ġ= Ġtitle ĊĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( metadata Compat . build ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġweb Page Settings Ġ= Ġdb Helper . get Web Page Settings ( web Page . url ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( web Page Settings . filePath Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Text Ġ= Ġload FromFile ( web Page Settings ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload From Web ( web Page Settings ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload FromFile ( web Page Settings : ĠWeb Page Settings ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinternal FilePath Ġ= Ġ"$ FILE _ PROTOCOL ${ web Page Settings . filePath }" ĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠFile ( internal FilePath . substring ( FILE _ PROTOCOL . length )) ĊĠĠĠĠĠĠĠ Ġif Ġ(! input . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload From Web ( web Page Settings ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġweb Page Settings . redirect ed Url Ġ?: Ġinternal FilePath ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠJ soup . parse ( input , Ġ" UTF - 8 ", Ġurl ) Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġreturn Ġclean Document Text ( doc ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload From Web ( web Page Settings : ĠWeb Page Settings ) Ġ{ ĊĠĠĠĠĠĠĠ Ġblocking Job ?. cancel () ĊĠĠĠĠĠĠĠ Ġblocking Job Ġ= ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdoc Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġget Web Page Document ( web Page Settings . url ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc . location (). contains (" rss book ") Ġ&& Ġdoc . location (). contains ( Host Names . Q ID IAN )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc Ġ= Ġwith Context ( Dispatch ers . IO ) Ġ{ Ġget Web Page Document ( doc . location (). replace (" rss book ", Ġ" book ")) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Text Ġ= Ġclean Document Text ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġdoc . title () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Compat . display Subtitle Ġ= Ġtitle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Session . set Metadata ( metadata Compat . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogs . error (" TT S Service ", Ġ" Unable Ġto Ġread Ġchapter ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler ( Looper . get Main Looper ()). post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ TT S Service , Ġ" Unable Ġto Ġread Ġchapter ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Web Page Document ( url : ĠString ): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġclient . new Call ( GET ( url )). safe Execute (). as J soup () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Document Text ( doc : ĠDocument ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhtml Helper Ġ= ĠHtml Clean er . getInstance ( doc ) ĊĠĠĠĠĠĠĠ Ġhtml Helper . remove JS ( doc ) ĊĠĠĠĠĠĠĠ Ġhtml Helper . additional Processing ( doc ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc . get Formatted Text () ĊĠĠĠ Ġ} Ċ Ċ } Ċ