package Ġeu . mor ning bird . story tell ing engine . view Ċ Ċ import Ġandroid . animation . Object Animator Ċ import Ġandroid . animation . Property Values Holder Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Asset FileDescriptor Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . SYSTEM _ UI _ FLAG _ LAYOUT _ FULL SCREEN Ċ import Ġandroid . view . View . SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Default Item Animator Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . af ol le st ad . material dialogs . Material Dialog Ċ import Ġcom . af ol le st ad . material dialogs . lifecycle . lifecycle Owner Ċ import Ġcom . github . flo rent 3 7 . kotlin . please animate . Please Anim Ċ import Ġcom . github . flo rent 3 7 . kotlin . please animate . please Ċ import Ġeu . mor ning bird . story tell ing engine . R Ċ import Ġeu . mor ning bird . story tell ing engine . adapter . Messages Adapter Ċ import Ġeu . mor ning bird . story tell ing engine . databinding . Activity Story board Binding Ċ import Ġeu . mor ning bird . story tell ing engine . model .* Ċ import Ġeu . mor ning bird . story tell ing engine . model . util . Navigation Directions Ċ import Ġeu . mor ning bird . story tell ing engine . util . Event Ċ import Ġeu . mor ning bird . story tell ing engine . util . Logger Ċ import Ġeu . mor ning bird . story tell ing engine . util . Scroll Control LinearLayout Ċ import Ġeu . mor ning bird . story tell ing engine . util . click With De bounce Ċ import Ġeu . mor ning bird . story tell ing engine . view model . Story board ViewModel Ċ import Ġkotlinx . android . synt hetic . main . activity _ story board .* Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . util .* Ċ import Ġkotlin . math . round ToInt ĊĊ Ċ class ĠStory board Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Story board Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠStory board ViewModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠMessages Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscene Effects Player : ĠMedia Player ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbackground Player : ĠMedia Player ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage Effects Player : ĠMedia Player ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmessage Notification Player : ĠMedia Player ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtext ToS peech : ĠText ToS peech ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpul s ate : ĠObject Animator ĊĠĠĠ Ġ@ Volatile ĊĠĠĠ Ġvar Ġtyping Lock : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġval Ġscene Sound Pool : ĠLinkedList < Asset FileDescriptor > Ġ= ĠLinkedList () ĊĠĠĠ Ġprivate Ġval Ġmessage Sound Pool : ĠLinkedList < Asset FileDescriptor > Ġ= ĠLinkedList () ĊĠĠĠ Ġprivate Ġval Ġtext ToS peech OnInit Ġ= ĠText ToS peech . OnInit Listener Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= ĠText ToS peech . ERROR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . available Languages . contains ( Locale . US )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . language Ġ= ĠLocale . US ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( text ToS peech . available Languages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . language Ġ= Ġtext ToS peech . available Languages . first () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinit Binding () ĊĠĠĠĠĠĠĠ Ġinit Vars () ĊĠĠĠĠĠĠĠ Ġinit Views () ĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĠĠĠĠĠĠĠ Ġinit Observer s () ĊĠĠĠĠĠĠĠ Ġinit Re cycl ers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( scene Effects Player . is Playing ) Ġscene Effects Player . pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( background Player . is Playing ) Ġbackground Player . pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( message Effects Player . is Playing ) Ġmessage Effects Player . pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( message Notification Player . is Playing ) Ġmessage Notification Player . pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech . is Spe aking ) Ġtext ToS peech . stop () ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: viewModel . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . scene . value ?. let Ġ{ Ġscene Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene . music ?. let Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Background Music ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtyping Lock Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Effects Player . release () ĊĠĠĠĠĠĠĠ Ġbackground Player . release () ĊĠĠĠĠĠĠĠ Ġmessage Effects Player . release () ĊĠĠĠĠĠĠĠ Ġmessage Notification Player . release () ĊĠĠĠĠĠĠĠ Ġtext ToS peech . shutdown () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Binding () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this ). get ( Story board ViewModel :: class . java ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠData Binding Util . set ContentView ( this , ĠR . layout . activity _ story board ) ĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Effects Player . setOn Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Sound From Queue ( Sound Effect Type . SC ENE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmessage Effects Player . setOn Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay Sound From Queue ( Sound Effect Type . MESSAGE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstory board Constraint Layout . click With De bounce Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( typing Lock ) Ġreturn @ click With De bounce ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pul s ate . isRunning ) Ġpul s ate . pause () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ImageView . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTimeline . advance () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . decor View . system Ui Visibility Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( SYSTEM _ UI _ FLAG _ LAYOUT _ ST ABLE Ġor ĠSYSTEM _ UI _ FLAG _ LAYOUT _ FULL SCREEN ) ĊĠĠĠĠĠĠĠ Ġwindow . status Bar Color Ġ= Ġresources . getColor ( R . color . color StatusBar , Ġtheme ) ĊĊĠĠĠĠĠĠĠ Ġpul s ate Ġ= ĠObject Animator . of Property Values Holder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ImageView , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProperty Values Holder . of Float (" alpha ", Ġ 0 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġpul s ate . duration Ġ= Ġresources . getInteger ( R . integer . continue _ pulse _ frequency ). to Long () ĊĠĠĠĠĠĠĠ Ġpul s ate . repeat Count Ġ= ĠObject Animator . INF IN ITE ĊĠĠĠĠĠĠĠ Ġpul s ate . repeat Mode Ġ= ĠObject Animator . RE VERSE ĊĠĠĠĠĠĠĠ Ġpul s ate . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Vars () Ġ{ ĊĠĠĠĠĠĠĠ Ġscene Effects Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġmessage Effects Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġmessage Notification Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġbackground Player Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠ Ġtext ToS peech Ġ= ĠText ToS peech ( this , Ġtext ToS peech OnInit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Re cycl ers () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinear LayoutManager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠScroll Control LinearLayout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠLinearLayoutManager . VERTICAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreversed Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġchat RecyclerView . addItem Decoration ( Messages Adapter . Overlap Decoration ( resources . getInteger ( R . integer . message _ overlap ))) ĊĠĠĠĠĠĠĠ Ġchat RecyclerView . layout Manager Ġ= Ġlinear LayoutManager ĊĠĠĠĠĠĠĠ Ġval Ġanim ator : ĠDefault Item Animator Ġ= Ġobject Ġ: ĠDefault Item Animator () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcan Re use Updated ViewHolder ( view Holder : ĠRecyclerView . ViewHolder ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchat RecyclerView . item Animator Ġ= Ġanim ator ĊĠĠĠĠĠĠĠ Ġadapter Ġ= ĠMessages Adapter ( this ) ĊĠĠĠĠĠĠĠ Ġchat RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Observer s () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . navigation Event . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . get ()?. let Ġ{ Ġdirections Ġ-> Ġnavigate ( directions ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel . timeline Changed . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpair : ĠPair < Int , ĠInt > Ġ= Ġevent . get () Ġ?: Ġevent . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . update ( pair . first ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠviewModel . stage . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġstage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Characters On Stage ( stage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . message . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . fullscreen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Fullscreen ( it . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Fullscreen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Message Notification Sound () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . screen Reader ) Ġit . id ?. let Ġ{ Ġid Ġ-> Ġread Message ( it . text , Ġid ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Fullscreen () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . scene . observe ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ Ġscene Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Background ( scene . background ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene . music ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Background Music ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . scene Sound . observe ( this , ĠObserver Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sound To Queue ( it , ĠSound Effect Type . SC ENE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . message Sound . observe ( this , ĠObserver Ġ{ Ġpath Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Sound To Queue ( it , ĠSound Effect Type . MESSAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . type writer Animation Event . observe ( this , ĠObserver Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyping Ġ= Ġevent . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtyping ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( typing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyping Lock Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyping Lock Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ImageView . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpul s ate . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . saving Event . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . saving Indicator Visible . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ ĠviewModel . saving Indicator Visible . post Value ( false ) Ġ}, Ġ 3 0 0 0 L ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠviewModel . is Finished . observe ( this , ĠObserver Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinished Ġ= Ġevent . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( finished Ġ!= Ġnull Ġ&& Ġfinished ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠEnd Credits Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . navigation Event . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Directions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnd Credits Activity :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ ĠSettings . settings Changed . observe ( this , ĠObserver Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġevent . peek () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . first Ġ== ĠSettings . Settings Keys . M US IC _ VOLUME . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set Volume ( Settings . music Volume , ĠSettings . music Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . first Ġ== ĠSettings . Settings Keys . EFFECT S _ VOLUME . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Effects Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Effects Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . first Ġ== ĠSettings . Settings Keys . M UTE . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Effects Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Effects Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscene Effects Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Effects Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set Volume ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . effects Volume , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSettings . effects Volume ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set Volume ( Settings . music Volume , ĠSettings . music Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġread Message ( text : ĠString , Ġid : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġbundle . put Float ( Text ToS peech . Engine . KEY _ PARAM _ VOLUME , ĠSettings . screen Reader Volume ) ĊĠĠĠĠĠĠĠ Ġtext ToS peech . speak ( text , ĠText ToS peech . QUEUE _ FLUSH , Ġbundle , Ġid . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Sound From Queue ( type : ĠSound Effect Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠSound Effect Type . MESSAGE ) Ġmessage Effects Player Ġelse Ġscene Effects Player ĊĠĠĠĠĠĠĠ Ġval Ġpool Ġ= Ġif Ġ( type Ġ== ĠSound Effect Type . MESSAGE ) Ġmessage Sound Pool Ġelse Ġscene Sound Pool ĊĠĠĠĠĠĠĠ Ġif Ġ( pool . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġpool . remove First () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplayer . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Message Notification Sound () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġreturn ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġresources . assets . open Fd ( Settings . Assets . MESSAGE _ SOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( message Notification Player . is Playing ) Ġmessage Notification Player . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . set Volume ( Settings . effects Volume , ĠSettings . effects Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Notification Player . start () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Missing Ġmessage Ġsound Ġasset .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . Level . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Background Music ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġreturn ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġresources . assets . open Fd ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( background Player . is Playing ) Ġscene Effects Player . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . reset () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasset FileDescriptor . length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Settings . mute ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set Volume ( 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . set Volume ( Settings . music Volume , ĠSettings . music Volume ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Player . start () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . dis cre p ancy _ debug , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . Level . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Background ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( scene Background ImageView . tag Ġ== Ġpath ) Ġreturn ĊĠĠĠĠĠĠĠ Ġscene Background ImageView . tag Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscene Background ImageView . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable . createFrom Resource Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . assets . open ( path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( Logger . dis cre p ancy _ debug , ĠLogger . Level . DEBUG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Sound To Queue ( path : ĠString , Ġtype : ĠSound Effect Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplayer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠSound Effect Type . MESSAGE ) Ġmessage Effects Player Ġelse Ġscene Effects Player ĊĠĠĠĠĠĠĠ Ġval Ġpool Ġ= Ġif Ġ( type Ġ== ĠSound Effect Type . MESSAGE ) Ġmessage Sound Pool Ġelse Ġscene Sound Pool ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġasset FileDescriptor Ġ= Ġresources . assets . open Fd ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpool . add Last ( asset FileDescriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! player . is Playing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplay Sound From Queue ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . dis cre p ancy _ debug , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . Level . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Sprite ( image : ĠImageView , Ġsprite : ĠSprite ?, Ġcharacter : ĠCharacter ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsprite ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . setImage Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable . createFrom Resource Stream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . assets . open ( it . graphic ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . dis cre p ancy _ debug , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLogger . Level . DEBUG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġimage . tag Ġ= Ġcharacter ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Character Enter Animation ( ĊĠĠĠĠĠĠĠ Ġimage : ĠImageView , ĊĠĠĠĠĠĠĠ Ġcharacter : ĠCharacter ?, ĊĠĠĠĠĠĠĠ Ġsprite : ĠSprite ?, ĊĠĠĠĠĠĠĠ Ġspeaker : ĠPosition ?, ĊĠĠĠĠĠĠĠ Ġimage Position : ĠPosition ĊĠĠĠ Ġ): ĠPlease Anim Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplease ( duration Ġ= Ġ 3 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Ġ== Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate ( image ) Ġto Be Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight ( 2 5 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft ( 2 5 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvisible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeaker Ġ== Ġimage Position Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate ( image ) Ġto Be Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate ( image ) Ġto Be Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha ( 0 . 7 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Start Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Sprite ( image , Ġsprite , Ġcharacter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Character Leave Animation ( image : ĠImageView ): ĠPlease Anim Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġplease ( duration Ġ= Ġ 5 0 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate ( image ) Ġto Be Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginRight ( 2 5 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmarginLeft ( 2 5 6 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvisible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Characters On Stage ( stage : ĠStory board ViewModel . Stage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Left Character Ġ= Ġleft Character ImageView . tag Ġas ĠCharacter ? ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Right Character Ġ= Ġright Character ImageView . tag Ġas ĠCharacter ? ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Character Enter : ĠPlease Anim Ġ= Ġbuild Character Enter Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Character ImageView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . left Character , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . left Sprite , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . speaker , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition . LEFT ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġright Character Enter : ĠPlease Anim Ġ= Ġbuild Character Enter Animation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Character ImageView , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . right Character , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . right Sprite , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage . speaker , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition . RIGHT ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Left Character Ġ!= Ġstage . left Character ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Character Leave Animation ( left Character ImageView ). start (). with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Character Enter . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Character Enter . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Right Character Ġ!= Ġstage . right Character ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Character Leave Animation ( right Character ImageView ). start (). with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Character Enter . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Character Enter . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadjust Speaker Position ( stage . speaker ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadjust Speaker Position ( position : ĠPosition ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= ĠDisplay Metrics () ĊĠĠĠĠĠĠĠ Ġwindow Manager . default Display . get Metrics ( display Metrics ) ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġdisplay Metrics . width Pixels ĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Guide line . set Guide line Begin ( width Ġ/ Ġ 2 Ġ- Ġresources . getInteger ( R . integer . speaker _ adjust ment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPosition . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Guide line . set Guide line Begin ( width Ġ/ Ġ 2 Ġ+ Ġresources . getInteger ( R . integer . speaker _ adjust ment )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Guide line . set Guide line Begin ( width Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Fullscreen ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfullscreen Spacing TextView . text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġfullscreen TextView . chunk Ġ= Ġ( 6 Ġ* ĠSettings . text Animation Speed ). round ToInt () ĊĠĠĠĠĠĠĠ Ġfullscreen TextView . setText Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ PX , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension ( R . dim en . fullscreen _ message _ text _ base _ size ) Ġ* ĠSettings . fontSize ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfullscreen Spacing TextView . setText Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ PX , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension ( R . dim en . fullscreen _ message _ text _ base _ size ) Ġ* ĠSettings . fontSize ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfullscreen TextView . animate Text Ġ= Ġtext ĊĠĠĠĠĠĠĠ Ġchat Constraint Layout . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġfullscreen Message Constraint Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Fullscreen () Ġ{ ĊĠĠĠĠĠĠĠ Ġchat Constraint Layout . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġfullscreen Message Constraint Layout . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate ( directions : ĠNavigation Directions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , Ġdirections . destination ) ĊĠĠĠĠĠĠĠ Ġdirections . flags ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( flag Ġin Ġit ) Ġintent . add Flags ( flag ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdirections . bundle ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . put Extras ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġif Ġ( directions . should Finish Current Activity ) Ġthis . finish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ ĠMaterial Dialog ( this ). show Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner ( this @ Story board Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle ( R . string . dialog _ exit _ to _ menu _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ( R . string . dialog _ exit _ to _ menu _ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpositive Button ( R . string . exit ) Ġ{ Ġdialog Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( dialog . context , ĠTitle Screen Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . navigation Event . post Value ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Directions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTitle Screen Activity :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnegative Button ( R . string . cancel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠstartActivity ( intent : ĠIntent ?, Ġbundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . startActivity ( intent , Ġbundle ) ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( android . R . anim . fade _ in , Ġandroid . R . anim . fade _ out ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠSound Effect Type Ġ{ ĊĠĠĠĠĠĠĠ ĠMESSAGE , ĠSC ENE ĊĠĠĠ Ġ} Ċ Ċ } Ċ