/* Ċ Ġ* ĠModule : Ġr 2 - test app - kotlin Ċ Ġ* ĠDevelopers : ĠA fer d ita ĠM uri qi , ĠPaul ĠSto ica Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 8 . ĠEuropean ĠDigital ĠReading ĠLab . ĠAll Ġrights Ġreserved . Ċ Ġ* ĠLicensed Ġto Ġthe ĠRead ium ĠFoundation Ġunder Ġone Ġor Ġmore Ġcontributor Ġlicense Ġagreements . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġa ĠBSD - style Ġlicense Ġwhich Ġis Ġdetailed Ġin Ġthe Ċ Ġ* ĠLICENSE Ġfile Ġpresent Ġin Ġthe Ġproject Ġrepository Ġwhere Ġthis Ġsource Ġcode Ġis Ġmaintained . Ċ Ġ*/ Ċ Ċ package Ġorg . read ium . r 2 . test app . ep ub Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . speech . tts . Ut ter ance Progress Listener Ċ import Ġandroid . speech . tts . Voice Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġorg . js oup . J soup Ċ import Ġorg . js oup . select . Elements Ċ import Ġorg . read ium . r 2 . navigator . IR 2 TT S Ċ import Ġorg . read ium . r 2 . navigator . Visual Navigator Ċ import Ġorg . read ium . r 2 . shared . publication . Publication Ċ import Ġorg . read ium . r 2 . test app . Build Config . DEBUG Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* ĠR 2 Screen Reader Ċ Ġ* Ċ Ġ* ĠBasic Ġscreen Ġreader Ġoverlay Ġthat Ġuses ĠAndroid 's ĠText ToS peech Ċ Ġ*/ Ċ Ċ class ĠR 2 Screen Reader ( var Ġcontext : ĠContext , Ġvar Ġt ts Callbacks : ĠIR 2 TT S , Ġvar Ġt ts Cal back s 2 : ĠText Highlight , Ġvar Ġnavigator : ĠVisual Navigator , Ġvar Ġpublication : ĠPublic ation , Ġprivate Ġvar Ġport : ĠInt , Ġprivate Ġvar Ġe pub Name : ĠString , Ġinitial Resource Index : ĠInt ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġinitialized Ġ= Ġfalse ĊĊĠĠĠ Ġlateinit Ġvar Ġtemp Voice List : ĠMutable List < Voice >; ĊĊĠĠĠ Ġprivate Ġvar Ġresource Index Ġ= Ġinitial Resource Index ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ>= Ġitems . size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġitems . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ut ter ance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ< Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ut ter ance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġutter ances Ġ= Ġmutable ListOf < String >() ĊĊĠĠĠ Ġvar Ġcurrent Ut ter ance : ĠInt Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( field Ġ!= Ġ- 1 ) Ġfield Ġelse Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ== Ġ- 1 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ== Ġ 0 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ> Ġutter ances . size Ġ- Ġ 1 Ġ-> Ġutter ances . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ< Ġ 0 Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). d (" Current Ġutter ance Ġindex : Ġ$ current Ut ter ance ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġitems Ġ= Ġpublication . reading Order ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠP LAY _ SENT ENCE ( val Ġvalue : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ ĠS AME ( 0 ), ĊĠĠĠĠĠĠĠ ĠNEXT ( 1 ), ĊĠĠĠĠĠĠĠ ĠPRE V (- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtext ToS peech : ĠText ToS peech ĊĊĠĠĠ Ġvar Ġis Paused : ĠBoolean ĊĊĠĠĠ Ġval Ġis Spe aking : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtext ToS peech . is Spe aking ĊĊĠĠĠ Ġval Ġcurrent Resource ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġresource Index ĊĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// Initialize ĠT TS ĊĠĠĠĠĠĠĠ Ġtext ToS peech Ġ= ĠText ToS peech ( context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ToS peech . OnInit Listener Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġ( status Ġ!= ĠText ToS peech . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). d (" text ToS peech Ġinitialization Ġstatus : Ġ$ initialized ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, " com . google . android . tts ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget voices () Ġ{ ĊĠĠĠĠĠĠĠ Ġtext ToS peech . stop (); ĊĠĠĠĠĠĠĠ Ġtemp Voice List Ġ Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġtext ToS peech . get Vo ices ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v . locale . language . contains (" en ")) Ġ{ Ġ// Ġonly ĠEnglish Ġvo ices ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Voice List . add ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). d (" ve ee eee : Ġ${ temp Voice List . toString () }") ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ- ĠSet Ġa Ġtemporary Ġvar Ġto Ġis Paused Ġ( is Paused 's Ġvalue Ġmay Ġbe Ġaltered Ġby Ġcalls ). ĊĠĠĠĠ Ġ* Ġ- ĠStart Ġinitialization Ġif Ġ[ utter ances ] Ġis Ġempty . ĊĠĠĠĠ Ġ* Ġ- ĠStop Ġ[ text ToS peech ] Ġif Ġit Ġis Ġreading . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaused Ġ= Ġis Paused ĊĊĠĠĠĠĠĠĠ Ġif Ġ( utter ances . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( paused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpause Reading () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ- ĠUpdate Ġthe Ġresource Ġindex . ĊĠĠĠĠ Ġ* Ġ- ĠMark Ġ[ text ToS peech ] Ġas Ġreading . ĊĠĠĠĠ Ġ* Ġ- ĠStop Ġ[ text ToS peech ] Ġif Ġit Ġis Ġreading . ĊĠĠĠĠ Ġ* Ġ- ĠStart Ġ[ text ToS peech ] Ġsetup . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresource : ĠInt Ġ- ĠThe Ġindex Ġof Ġthe Ġresource Ġwe Ġwant Ġread . ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġgo To ( resource : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resource Ġ>= Ġitems . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġresource Index Ġ= Ġresource ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . is Spe aking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstart Reading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprevious Resource (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġresource Index -- ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . is Spe aking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstart Reading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Resource (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġresource Index ++ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . is Spe aking ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstart Reading () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInner Ġfunction Ġthat Ġsets Ġthe ĠText ĠTo ĠSpeech Ġlanguage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset TT SL anguage () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// get voices (); ĊĠĠĠĠĠĠĠ Ġ// val Ġlanguage Ġ= Ġtext ToS peech . set Language ( Locale ( publication . metadata . languages . first OrNull () Ġ?: Ġ"")) ĊĠĠĠĠĠĠĠ Ġ// text ToS peech . set Voice ( temp Voice List . get ( 1 6 )) ĊĠĠĠĠĠĠĠ Ġval Ġlanguage Ġ= Ġtext ToS peech . set Language ( Locale ( publication . metadata . languages . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"")) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( language Ġ== ĠText ToS peech . LANG _ MISSING _ DATA Ġ|| Ġlanguage Ġ== ĠText ToS peech . LANG _ NOT _ SUPPORTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context . application Context , Ġ" There Ġwas Ġan Ġerror Ġwith Ġthe ĠT TS Ġlanguage , Ġswitching Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġ" to ĠEN - US ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . language Ġ= ĠLocale . US ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInner Ġfunction Ġthat Ġsets Ġthe Ġutter ances Ġvariable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġutter ances Ġwas Ġable Ġto Ġbe Ġfilled Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Ut ter ances (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Load Ġresource Ġas Ġsentences ĊĠĠĠĠĠĠĠ Ġutter ances Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠPublic ation . local Url Of ( filename Ġ= Ġe pub Name , Ġport Ġ= Ġport , Ġhref Ġ= Ġitems [ resource Index ]. href ) ĊĠĠĠĠĠĠĠ Ġsplit Resource And AddTo Ut ter ances ( url ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġwhile Ġ(++ resource Index Ġ< Ġitems . size Ġ&& Ġutter ances . size Ġ== Ġ 0 ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠPublic ation . local Url Of ( filename Ġ= Ġe pub Name , Ġport Ġ= Ġport , Ġhref Ġ= Ġitems [ resource Index ]. href ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Resource And AddTo Ut ter ances ( url ) Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( resource Index Ġ== Ġitems . size ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ-- resource Index ĊĊĠĠĠĠĠĠĠ Ġreturn Ġutter ances . size Ġ!= Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthe Ġcore Ġsetup Ġfunctions Ġto Ġset Ġthe Ġlanguage , Ġthe Ġutter ances Ġand Ġthe Ġcallbacks . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġexecuting Ġthe Ġfunction Ġwas Ġsuccessful Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġconfigure (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġset TT SL anguage () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġset Ut ter ances () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġflush Ut ter ances Queue () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġset TT S Callbacks () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġis Google Engine Installed (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġt ts Intent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġt ts Intent . action Ġ= ĠText ToS peech . Engine . ACTION _ CHECK _ TT S _ DATA ĊĠĠĠĠĠĠĠ Ġval Ġpm : ĠPackage Manager Ġ= Ġcontext . get PackageManager () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġpm . query Intent Activities ( tts Intent , ĠPackage Manager . GET _ META _ DATA ) ĊĠĠĠĠĠĠĠ Ġvar Ġgoogle Is Installed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlist . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve Info Under Sc rut iny Ġ= Ġlist [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġengine Name Ġ= Ġresolve Info Under Sc rut iny . activity Info . application Info . packageName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( engine Name Ġ== Ġ" com . google . android . tts ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġversion Ġ= Ġ" null " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġpm . get Package Info ( engine Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . GET _ META _ DATA ). version Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" XXX ", Ġ" Error Ġgetting Ġgoogle Ġengine Ġver ion : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" XXX ", Ġ" Google Ġengine Ġversion Ġ$ version Ġis Ġinstalled !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgoogle Is Installed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" XXX ", Ġ" Google ĠEngine Ġis Ġnot Ġinstalled !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġgoogle Is Installed ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġthe ĠT TS Ġcallbacks . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġsetting Ġthe Ġcallbacks Ġwas Ġsuccessful Ġor Ġnot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset TT S Callbacks (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġtext ToS peech . setOn Ut ter ance Progress Listener ( object Ġ: ĠUt ter ance Progress Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġutter ance Ġ" starts " Ġas Ġper ceived Ġby Ġthe Ġcaller . ĠThis Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbe Ġsoon Ġbefore Ġaudio Ġis Ġplayed Ġback Ġin Ġthe Ġcase Ġof Ġa Ġ[ Text ToS peech . speak ] ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġor Ġbefore Ġthe Ġfirst Ġbytes Ġof Ġa Ġfile Ġare Ġwritten Ġto Ġthe Ġfile Ġsystem Ġin Ġthe Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġof Ġ[ Text ToS peech . synthesize ToFile ]. ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġutter ance Id ĠThe Ġutter ance ĠID Ġof Ġthe Ġutter ance . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonStart ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ut ter ance Ġ= Ġutter ance Id !!. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġt ts Callbacks . play TextChanged ( utter ances [ current Ut ter ance ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Callbacks . play StateChanged ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Range Start ( utter ance Id : ĠString ?, Ġstart : ĠInt , Ġend : ĠInt , Ġframe : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Range Start ( utter ance Id , Ġstart , Ġend , Ġframe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Cal back s 2 . play Highlight TextChanged ( utter ances [ current Ut ter ance ], Ġstart , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġutter ance Ġis Ġstopped , Ġwhether Ġvol unt arily Ġby Ġthe Ġuser , Ġor Ġnot . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġutter ance Id ĠThe Ġutter ance ĠID Ġof Ġthe Ġutter ance . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġinterrupted ĠWhether Ġor Ġnot Ġthe Ġspeaking Ġhas Ġbeen Ġinterrupted . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Stop ( utter ance Id : ĠString ?, Ġinterrupted : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inter rupted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Callbacks . play StateChanged ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġutter ance Ġhas Ġsuccessfully Ġcompleted Ġprocessing . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠAll Ġaudio Ġwill Ġhave Ġbeen Ġplayed Ġback Ġby Ġthis Ġpoint Ġfor Ġaud ible Ġoutput , Ġand Ġall ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġoutput Ġwill Ġhave Ġbeen Ġwritten Ġto Ġdisk Ġfor Ġfile Ġsynt hesis Ġrequests . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġrequest Ġis Ġguaranteed Ġto Ġbe Ġcalled Ġafter Ġ[. onStart ]. ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġutter ance Id ĠThe Ġutter ance ĠID Ġof Ġthe Ġutter ance . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Done ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt ts Callbacks . play StateChanged ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( utter ance Id . equals (( utter ances . size Ġ- Ġ 1 ). toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( items . size Ġ- Ġ 1 Ġ== Ġresource Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Screen Reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Reading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . go Forward ( false , Ġcompletion Ġ= Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Resource () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Reading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠCalled Ġwhen Ġan Ġerror Ġhas Ġoccurred Ġduring Ġprocessing . ĠThis Ġcan Ġbe Ġcalled ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġat Ġany Ġpoint Ġin Ġthe Ġsynt hesis Ġprocess . ĠNote Ġthat Ġthere Ġmight Ġbe Ġcalls ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġto Ġ[. onStart ] Ġfor Ġspecified Ġutter ance Id Ġbut Ġthere Ġwill Ġnever ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġbe Ġa Ġcall Ġto Ġboth Ġ[. on Done ] Ġand Ġ[. onError ] Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġsame Ġutter ance . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġutter ance Id ĠThe Ġutter ance ĠID Ġof Ġthe Ġutter ance . ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( utter ance Id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e (" Error Ġsaying : Ġ${ utter ances [ utter ance Id !!. toInt () ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( res Ġ== ĠText ToS peech . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e (" TT S Ġfailed Ġto Ġset Ġcallbacks ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDis miss Ġthe Ġscreen Ġreader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdismiss Screen Reader () Ġ{ ĊĠĠĠĠĠĠĠ Ġpause Reading () ĊĠĠĠĠĠĠĠ Ġt ts Callbacks . dismiss Screen Reader () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġreading Ġand Ġdestroy Ġthe Ġ[ text ToS peech ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġshutdown () Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialized Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġstop Reading () ĊĠĠĠĠĠĠĠ Ġtext ToS peech . shutdown () ĊĠĠĠĠĠĠĠ Ġtemp Voice List . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġ[ is Paused ] Ġto Ġfalse Ġand Ġadd Ġthe Ġ[ utter ances ] Ġto Ġthe Ġ[ text ToS peech ] Ġqueue Ġif Ġ[ configure ] Ġworked ĊĠĠĠĠ Ġ* Ġsuccessfully Ġ( return ing Ġtrue ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Reading (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( initialized Ġ&& Ġconfigure ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ut ter ance Ġ>= Ġutter ances . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e (" Invalid Ġcurrent Ut ter ance Ġvalue : Ġ$ current Ut ter ance Ġ. ĠExpected Ġless Ġthan Ġ$ utter ances . size ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Ut ter ance Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġcurrent Ut ter ance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Ġuntil Ġutter ances . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! addTo Ut ter ances Queue ( utter ances [ i ], Ġi )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( initialized Ġ&& Ġ( items . size Ġ- Ġ 1 ) Ġ> Ġresource Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigator . go Forward ( false , Ġcompletion Ġ= Ġ{}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Resource () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġif Ġ(! initialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . application Context , Ġ" There Ġwas Ġan Ġerror Ġwith Ġthe ĠT TS Ġinitialization ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ LONG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġtext Ġto Ġspeech Ġand Ġset Ġ[ is Paused ] Ġto Ġtrue Ġso Ġthat Ġsubsequent Ġplaying Ġof ĠT TS Ġwill Ġnot Ġautomatically ĊĠĠĠĠ Ġ* Ġstart Ġplaying . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpause Reading () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStop Ġtext Ġto Ġspeech Ġand Ġset Ġ[ is Paused ] Ġto Ġfalse Ġso Ġthat Ġsubsequent Ġplaying Ġof ĠT TS Ġwill Ġautomatically ĊĠĠĠĠ Ġ* Ġstart Ġplaying . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstop Reading () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllow Ġto Ġresume Ġplaying Ġfrom Ġthe Ġstart Ġof Ġthe Ġcurrent Ġtrack Ġwhile Ġstill Ġbeing Ġin Ġa Ġcompletely Ġblack Ġbox . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean Ġ- ĠWhether Ġres uming Ġplaying Ġfrom Ġthe Ġstart Ġof Ġthe Ġcurrent Ġtrack Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġresume Reading () Ġ{ ĊĠĠĠĠĠĠĠ Ġplay Sentence ( PLAY _ SENT ENCE . SAME ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllow Ġto Ġgo Ġthe Ġnext Ġsentence Ġwhile Ġstill Ġbeing Ġin Ġa Ġcompletely Ġblack Ġbox . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean Ġ- ĠWhether Ġmoving Ġto Ġthe Ġnext Ġsentence Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnext Sentence (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplay Sentence ( PLAY _ SENT ENCE . NEXT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAllow Ġto Ġgo Ġthe Ġprevious Ġsentence Ġwhile Ġstill Ġbeing Ġin Ġa Ġcompletely Ġblack Ġbox . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean Ġ- ĠWhether Ġmoving Ġto Ġthe Ġprevious Ġsentence Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprevious Sentence (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplay Sentence ( PLAY _ SENT ENCE . PREV ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġentry Ġpoint Ġfor Ġthe Ġhosting Ġactivity Ġto Ġadjust Ġspeech Ġspeed . ĠInput Ġis Ġconsidered Ġvalid Ġand Ġwithin Ġarbitrary ĊĠĠĠĠ Ġ* Ġset Ġboundaries . ĠThe Ġupdate Ġis Ġnot Ġinstant aneous Ġand Ġ[ Text ToS peech ] Ġneeds Ġto Ġbe Ġpaused Ġand Ġres umed Ġfor Ġit Ġto Ġwork . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠPrint Ġan Ġexception Ġif Ġ[ text ToS peech . set Speech Rate ( speed )] Ġfails . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġspeed : ĠFloat Ġ- ĠThe Ġspeech Ġspeed Ġwe Ġwish Ġto Ġuse Ġwith ĠAndroid 's Ġ[ Text ToS peech ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Speech Speed ( speed : ĠFloat , Ġrestart : ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . set Speech Rate ( speed ) Ġ== ĠText ToS peech . ERROR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Failed Ġto Ġupdate Ġspeech Ġspeed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( restart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpause Reading () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresume Reading () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e ( e . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe order Ġthe Ġtext Ġto Ġspeech Ġqueue Ġ( after Ġflush ing Ġit ) Ġaccording Ġto Ġthe Ġcurrent Ġtrack Ġand Ġthe Ġargument Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplay Sentence : Ġ[ PLAY _ SENT ENCE ] Ġ- ĠThe Ġtrack Ġto Ġplay Ġ( relative Ġto Ġthe Ġcurrent Ġtrack ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġwas Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġplay Sentence ( play Sentence : ĠP LAY _ SENT ENCE ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġis Paused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġcurrent Ut ter ance Ġ+ Ġplay Sentence . value ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġutter ances . size Ġ|| Ġindex Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! flush Ut ter ances Queue ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġindex Ġuntil Ġutter ances . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! addTo Ut ter ances Queue ( utter ances [ i ], Ġi )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġthat Ġmanages Ġadding Ġan Ġutter ance Ġto Ġthe ĠText ĠTo ĠSpeech Ġfor Ġus . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġadding Ġthe Ġutter ance Ġto Ġthe ĠText ĠTo ĠSpeech Ġqueue Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠaddTo Ut ter ances Queue ( utter ance : ĠString , Ġindex : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . speak ( utter ance , ĠText ToS peech . QUEUE _ ADD , Ġnull , Ġindex . toString ()) Ġ== ĠText ToS peech . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e (" Error Ġwhile Ġadding Ġutter ance : Ġ$ utter ance Ġto Ġthe ĠT TS Ġqueue ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHelper Ġfunction Ġthat Ġmanages Ġflush ing Ġthe ĠText ĠTo ĠSpeech Ġfor Ġus . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġflush ing Ġthe ĠText ĠTo ĠSpeech Ġqueue Ġwas Ġsuccessful . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġflush Ut ter ances Queue (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . speak ("", ĠText ToS peech . QUEUE _ FLUSH , Ġnull , Ġnull ) Ġ== ĠText ToS peech . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e (" Error Ġwhile Ġflush ing ĠT TS Ġqueue .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ/* Voice Ġchange Ġhappens Ġhere */ ĊĠĠĠĠĠĠĠ Ġset Human Voice () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Human Voice () Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* Here Ġwe Ġsetting Ġthe Ġvoice Ġmanually Ġby Ġsetting Ġvalues Ġto Ġthe ĠVoice Ġmodel ĊĠĠĠĠĠĠĠ Ġ* Ġwe Ġcan Ġadd Ġmale Ġvoice Ġtoo Ġby Ġadding Ġcorresponding Ġvoice Ġnames */ ĊĠĠĠĠĠĠĠ Ġval Ġv Ġ= ĠVoice (" en - IN - language ", ĠLocale (" en _ IN "), Ġ 4 0 0 , Ġ 2 0 0 , Ġfalse , Ġset Of (" network Timeout Ms ", Ġ" network Retries Count ")) ĊĠĠĠĠĠĠĠ Ġtext ToS peech . set Voice ( v ); ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĠHashMap < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġmap [ Text ToS peech . Engine . KEY _ PARAM _ UT TER ANCE _ ID ] Ġ= Ġ" mer p " ĊĠĠĠĠĠĠĠ Ġtext ToS peech . speak ("", ĠText ToS peech . QUEUE _ FLUSH , Ġmap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSplit Ġall Ġthe Ġparagraphs Ġof Ġthe Ġresource Ġinto Ġsentences . ĠThe Ġsentences Ġare Ġthen Ġadded Ġto Ġthe Ġ[ utter ances ] Ġlist . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġelements : ĠElements Ġ- ĠThe Ġlist Ġof Ġelements Ġ( paragraph s ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsplit Paragraph And AddTo Ut ter ances ( elements : ĠElements ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Size Ġ= Ġelements . size ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġelement Size ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġelements . eq ( i ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element .` is ` (" p ") Ġ|| Ġelement .` is ` (" h 1 ") Ġ|| Ġelement .` is ` (" h 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġelement .` is ` (" h 3 ") Ġ|| Ġelement .` is ` (" div ") Ġ|| Ġelement .` is ` (" span ")) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġsentences Ġ= Ġelement . text (). split ( Regex (" (? <= \\. Ġ| ( ,{ 1 })) ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsentences Ġ= Ġelement . text (). split ( Regex (" (? <= \\ .) ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sentence Ġin Ġsentences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsentence Clean ed Ġ= Ġsentence ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sentence Clean ed . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sentence Clean ed . first () Ġ== Ġ' Ġ') Ġsentence Clean ed Ġ= Ġsentence Clean ed . remove Range ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sentence Clean ed . last () Ġ== Ġ' Ġ') Ġsentence Clean ed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsentence Clean ed . remove Range ( sentence Clean ed . length Ġ- Ġ 1 , Ġsentence Clean ed . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġutter ances . add ( sentence Clean ed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFetch Ġa Ġresource Ġand Ġget Ġshort Ġsentences Ġfrom Ġit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresource Url : ĠString Ġ- ĠThe Ġhtml Ġresource Ġto Ġfetch Ġfrom Ġthe Ġinternal Ġserver , Ġcontaining Ġthe Ġtext Ġto Ġbe ĊĠĠĠĠ Ġ* ĠĠ Ġvo iced . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return : ĠBoolean Ġ- ĠWhether Ġthe Ġfunction Ġexecuted Ġsuccessfully . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsplit Resource And AddTo Ut ter ances ( resource Url : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġthread Ġ= ĠThread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠJ soup . connect ( resource Url ). get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġdocument . select ("* ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Paragraph And AddTo Ut ter ances ( elements ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG ) ĠTim ber . tag ( this :: class . java . simple Name ). e ( e . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Runnable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġthread . start () ĊĠĠĠĠĠĠĠ Ġthread . join () ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} Ċ }