/* ĠCopyright Ġ 2 0 2 0 ĠPre E mpt ive ĠSolutions , ĠLLC . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠThis Ġsource Ġis Ġsubject Ġto Ġthe ĠMicrosoft ĠPublic ĠLicense Ġ( MS - PL ). Ċ Ġ* ĠPlease Ġsee Ġthe ĠLICENSE . txt Ġfile Ġfor Ġmore Ġinformation . Ċ Ġ*/ Ċ package Ġcom . dash o . android . kotlin Sample Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Resources Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . OnClickListener Ċ import Ġandroid . widget . Toast Ċ import Ġkotlinx . android . synt hetic . main . fib _ main . calc Fib Btn Ċ import Ġkotlinx . android . synt hetic . main . fib _ main . calc Fib Res Ċ import Ġkotlinx . android . synt hetic . main . fib _ main . fib Seq Num Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . async Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . text . NumberFormat ĊĊ Ċ const Ġval ĠWARN _ SEQUENCE Ġ= Ġ 3 0 Ċ const Ġval ĠMAX _ SEQUENCE Ġ= Ġ 5 0 Ċ Ċ /** Ċ Ġ* ĠThe ĠF ib onacci Ġcalculator Ċ Ġ* Ġ@ author ĠM att ĠIn sk o Ċ Ġ*/ Ċ class ĠF ib Activity Ġ: ĠActivity (), ĠOn ClickListener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġnum Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġmax Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġparent Job Ġ= ĠJob () ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope Ġ= ĠCor outine Scope ( Dispatch ers . Main Ġ+ Ġparent Job ) ĊĠĠĠ Ġprivate Ġval Ġnf Ġ= ĠNumber Format . getInteger Instance () ĊĠĠĠ Ġpublic Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . fib _ main ) ĊĠĠĠĠĠĠĠ Ġcalc Fib Btn . setOnClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġbutton Ġclick ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v Ġ== Ġcalc Fib Btn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Fib Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPro cesses Ġthe Ġrequest . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprocess Fib Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( calc Fib Res . text . startsWith ( getString ( R . string . fib Calc Processing ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , ĠR . string . fib Proc , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcalc Fib Res . setText ( R . string . fib Calc Processing ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnum Ġ= Ġfib Seq Num . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseq Ġ= Ġnum . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Ġ> ĠMAX _ SEQUENCE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Ġ= ĠMAX _ SEQUENCE . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( application Context , ĠgetString ( R . string . fib Too Large , ĠMAX _ SEQUENCE ) Ġ, ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfib Seq Num . setText ( num ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Ġ< Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Number Error () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseq Ġ> ĠWARN _ SEQUENCE Ġ-> ĠToast . makeText ( application Context , ĠR . string . fib Large , ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Fib () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Number Error () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShows Ġan Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Number Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdlg Alert Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġdlg Alert . setMessage ( R . string . bad Num ) ĊĠĠĠĠĠĠĠ Ġdlg Alert . setTitle ( R . string . err Title ) ĊĠĠĠĠĠĠĠ Ġdlg Alert . set Positive Button ( Resources . getSystem (). getText ( android . R . string . ok ), Ġnull ) ĊĠĠĠĠĠĠĠ Ġdlg Alert . set Cancel able ( true ) ĊĠĠĠĠĠĠĠ Ġdlg Alert . create (). show () ĊĠĠĠĠĠĠĠ Ġcalc Fib Res . text Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe ĠF ib onacci Ġnumber Ġat Ġthat Ġsequence Ġindex ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Fib () Ġ{ ĊĠĠĠĠĠĠĠ Ġmax Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Fib Res . text Ġ= Ġnf . format ( get Fib Async ( num . toInt ()). await ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġthe ĠF ib onacci Ġnumber Ġvia Ġa Ġcoroutine ĊĠĠĠĠ Ġ* Ġ@ param Ġnum ĠThe Ġsequence Ġnumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Fib Async ( num : ĠInt ): ĠDeferred < Long > Ġ= ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . async ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ async Ġcalc Fib ( num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReports Ġthe Ġprogress ĊĠĠĠĠ Ġ* Ġ@ param Ġcurrent Num ĠThe Ġsequence Ġnumber Ġjust Ġcalculated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreport Max ( current Num : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( max Ġ< Ġcurrent Num ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġcurrent Num ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Fib Res . text Ġ= Ġresources . getString ( R . string . fib Calc Progress , Ġmax ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalculates Ġthe ĠF ib onacci Ġnumber Ġat Ġa Ġcertain Ġlocation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnum ĠThe Ġlocation ĊĠĠĠĠ Ġ* Ġ@ return ĠThe ĠF ib onacci Ġnumber Ġat Ġthat Ġlocation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcalc Fib ( num : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( num Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Fib ( num Ġ- Ġ 1 ) Ġ+ Ġcalc Fib ( num Ġ- Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreport Max ( num ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠS aves Ġthe Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences (" Fib Prefs ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġval Ġpref Editor Ġ= Ġprefs . edit () ĊĠĠĠĠĠĠĠ Ġpref Editor . putString (" seq ", Ġnum ) ĊĠĠĠĠĠĠĠ Ġpref Editor . apply () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRest ores Ġthe Ġlast Ġrequest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġget SharedPreferences (" Fib Prefs ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġnum Ġ= Ġprefs . getString (" seq ", ĠgetString ( R . string . fib Seq Def )) ? :" 1 1 " ĊĠĠĠĠĠĠĠ Ġfib Seq Num . setText ( num ) ĊĠĠĠĠĠĠĠ Ġfib Seq Num . setSelection ( num . length ) ĊĠĠĠ Ġ} Ċ } Ċ