package Ġcom . and l ill . j fd . app . flash card Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . and l ill . j fd . R Ċ import Ġcom . and l ill . j fd . model . Collection Ċ import Ġcom . and l ill . j fd . model . Dictionary Entry Ċ import Ġcom . and l ill . j fd . utils . AppSettings Ċ import Ġcom . and l ill . j fd . utils . App Utils Ċ import Ġcom . google . android . material . progress indicator . Linear Progress Indicator Ċ import Ġjava . util .* Ċ Ċ class ĠFlash Card Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG UMENT _ COLLECTION Ġ= Ġ" com . and l ill . j ld . Collection " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠFlash card ĠView ĠModel ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠviewModel : ĠFlash Card Activity ViewModel ĊĊĠĠĠ Ġ// ĠViews ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrestart Button : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnext Stage Button : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrestart Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnext Stage Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġstage Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprogress Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠprogressBar : ĠLinear Progress Indicator ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbackground Card : ĠView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbackground Card Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtext ToS peech : ĠText ToS peech ĊĊĠĠĠ Ġprivate Ġvar Ġtext ToS peech Enabled Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ flash card ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġsettings . ĊĠĠĠĠĠĠĠ Ġtext ToS peech Enabled Ġ= ĠApp Settings . getText ToS peech ( this ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġintent Ġextras . ĊĠĠĠĠĠĠĠ Ġval Ġcollection Ġ= Ġintent . get Serializable Extra ( ARGUMENT _ COLLECTION ) Ġas ĠCollection ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġflash card Ġview Ġmodel . ĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠViewModel Provider ( this )[ Flash Card Activity ViewModel :: class . java ] ĊĠĠĠĠĠĠĠ ĠviewModel . initialize ( collection ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġviews . ĊĠĠĠĠĠĠĠ Ġstage Text Ġ= ĠfindViewById ( R . id . text _ stage ) ĊĠĠĠĠĠĠĠ Ġprogress Text Ġ= ĠfindViewById ( R . id . text _ progress ) ĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById ( R . id . progress _ bar ) ĊĠĠĠĠĠĠĠ Ġbackground Card Ġ= ĠfindViewById ( R . id . card _ background ) ĊĠĠĠĠĠĠĠ Ġbackground Card Text Ġ= ĠfindViewById ( R . id . text _ background ) ĊĠĠĠĠĠĠĠ Ġrestart Text Ġ= ĠfindViewById ( R . id . text _ restart ) ĊĠĠĠĠĠĠĠ Ġnext Stage Text Ġ= ĠfindViewById ( R . id . text _ next _ stage ) ĊĠĠĠĠĠĠĠ Ġrestart Button Ġ= ĠfindViewById < View >( R . id . button _ restart ). apply Ġ{ Ġset OnClickListener Ġ{ Ġrestart ( collection ) Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġnext Stage Button Ġ= ĠfindViewById < View >( R . id . button _ next _ stage ). apply Ġ{ Ġset OnClickListener Ġ{ Ġnext Stage () Ġ} Ġ} ĊĠĠĠĠĠĠĠ ĠfindViewById < Image Button >( R . id . button _ back ). apply Ġ{ Ġset OnClickListener Ġ{ Ġfinish () Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ ĠviewModel . get Flash Cards (). observe ( this , Ġ{ Ġcards Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Restart Button ( cards . size , ĠviewModel . get Stage Size ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Next Stage Button ( cards . size , ĠviewModel . get Stage Size ()) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ ĠviewModel . get Stage (). observe ( this , Ġ{ Ġstage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstage Text . text Ġ= ĠString . format ( getString ( R . string . study _ stage ), Ġstage ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġthis . draw Card () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġtext ToS peech Ġ= ĠText ToS peech ( this ) Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠText ToS peech . SUCCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . language Ġ= ĠLocale . J AP ANE SE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġstatus Ġbar Ġto Ġdark Ġif Ġnot Ġin Ġnight Ġmode . ĊĠĠĠĠĠĠĠ Ġif Ġ(! App Utils . is Dark Mode ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Utils . setStatus Bar Dark ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġtext ToS peech . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġstatus Ġbar Ġback Ġto Ġlight Ġif Ġnot Ġin Ġnight Ġmode . ĊĠĠĠĠĠĠĠ Ġif Ġ(! App Utils . is Dark Mode ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Utils . setStatus Bar Light ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġtext ToS peech . shutdown () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Fragments () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġflash card Ġfragments . ĊĠĠĠĠĠĠĠ Ġfor Ġ( fragment Ġin Ġsupport FragmentManager . fragments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). remove ( fragment ). commit Now () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Front Card Fragment ( dictionary Entry : ĠDictionary Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġflash card Ġfragment . ĊĠĠĠĠĠĠĠ Ġval Ġcard Fragment Ġ= ĠFlash Card Fragment ( dictionary Entry , ĠFlash Card Fragment . Type . Front ) Ġ{ Ġaction , Ġdirection Ġ-> Ġhandle Card Action ( action , Ġdirection ) Ġ} ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction (). add ( R . id . fragment _ container , Ġcard Fragment ). commit () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAn imate Ġflash Ġcard . ĊĠĠĠĠĠĠĠ Ġcard Fragment . lifecycle Scope . launch When Res umed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxy Ġ= ĠTyped Value . apply Dimension ( Typed Value . COMPLEX _ UNIT _ DIP , Ġ 2 f , Ġresources . display Metrics ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcard View Ġ= Ġcard Fragment . get Card View () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . translation X Ġ= Ġxy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . translation Y Ġ= Ġxy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard View . animate (). set Duration ( 1 0 0 ). translation X (- xy ). translation Y (- xy ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Back Card Fragment ( dictionary Entry : ĠDictionary Entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcard Fragment Ġ= ĠFlash Card Fragment ( dictionary Entry , ĠFlash Card Fragment . Type . Back ) Ġ{ Ġaction , Ġdirection Ġ-> Ġhandle Card Action ( action , Ġdirection ) Ġ} ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Animations ( R . anim ator . card _ flip _ left _ in , ĠR . anim ator . card _ flip _ left _ out , ĠR . anim ator . card _ flip _ left _ in , ĠR . anim ator . card _ flip _ left _ out ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . fragment _ container , Ġcard Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addTo Back Stack ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text ToS peech Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcard Fragment . lifecycle Scope . launch When Res umed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext ToS peech . speak ( dictionary Entry . reading [ 0 ]. k ana , ĠText ToS peech . QUEUE _ FLUSH , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Text . text Ġ= ĠviewModel . get Progress Text () ĊĠĠĠĠĠĠĠ ĠprogressBar . set Progress Compat ( viewModel . get Progress Amount (), Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Restart Button ( size : ĠInt , Ġstage Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( size Ġ== Ġ 0 Ġ&& Ġstage Size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Text . animate (). set Duration ( 1 0 0 ). alpha ( 1 f ). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . animate (). set Duration ( 1 0 0 ). alpha ( 1 f ). with Start Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Text . animate (). set Duration ( 1 0 0 ). alpha ( 0 f ). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . animate (). set Duration ( 1 0 0 ). alpha ( 0 f ). with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Next Stage Button ( size : ĠInt , Ġstage Size : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( size Ġ== Ġ 0 Ġ&& Ġstage Size Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Text . animate (). set Duration ( 1 0 0 ). alpha ( 1 f ). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . animate (). set Duration ( 1 0 0 ). alpha ( 1 f ). with Start Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Text . animate (). set Duration ( 1 0 0 ). alpha ( 0 f ). start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . animate (). set Duration ( 1 0 0 ). alpha ( 0 f ). with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Stage Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Background Card ( visible : ĠBoolean , Ġtext : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġwhen Ġ( visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbackground Card . visibility Ġ= Ġvisibility ĊĠĠĠĠĠĠĠ Ġbackground Card Text . text Ġ= Ġtext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Card Action ( action : ĠFlash Card Fragment . Action , Ġdirection : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlash Card Fragment . Action . Click Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflip Card () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFlash Card Fragment . Action . Dismiss Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( direction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrag gable Card View . DIRECTION _ LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . stage Card () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrag gable Card View . DIRECTION _ RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . dismiss Card () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Card () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestart ( collection : ĠCollection ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . initialize ( collection ) ĊĠĠĠĠĠĠĠ Ġdraw Card () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext Stage () Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . next Stage () ĊĠĠĠĠĠĠĠ Ġdraw Card () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Card () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . remove Fragments () ĊĊĠĠĠĠĠĠĠ Ġval Ġflash Cards Ġ= ĠviewModel . get Flash Cards (). value Ġas ĠArrayList ĊĠĠĠĠĠĠĠ Ġif Ġ( flash Cards . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( flash Cards . size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Background Card ( true , Ġflash Cards [ 1 ]. get Primary Reading ()) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Background Card ( false , Ġ"") ĊĊĠĠĠĠĠĠĠ Ġcreate Front Card Fragment ( flash Cards [ 0 ]) ĊĠĠĠĠĠĠĠ ĠviewModel . can Flip Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġflip Card () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! viewModel . can Flip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġflash Cards Ġ= ĠviewModel . get Flash Cards (). value Ġas ĠArrayList ĊĠĠĠĠĠĠĠ Ġcreate Back Card Fragment ( flash Cards [ 0 ]) ĊĠĠĠĠĠĠĠ ĠviewModel . can Flip Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ }