package Ġcom . nico que i jo . android . currency converter . kotlin . view model Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Application Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Image Button Ċ import Ġandroidx . h ilt . lifecycle . ViewModel Inject Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . data . Repository Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . model . Currency Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Currency Conversion Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . EMPTY Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . Order .* Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . element After Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . element Before Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . has Only One Element Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . isNot Last Element Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . isValid Ċ import Ġcom . nico que i jo . android . currency converter . kotlin . util . Utils . round To Four Decimal Places Ċ import Ġdagger . h ilt . android . scopes . Activity Ret ained Scoped Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . util .* Ċ Ċ @ Activity Ret ained Scoped Ċ class ĠWatch list ViewModel Ġ@ ViewModel Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġrepository : ĠRepository , ĊĠĠĠĠĠĠĠ Ġapplication : ĠApplication ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġupsert Currency ( currency : ĠCurrency ) Ġ= Ġrepository . upsert Currency ( currency ) ĊĠĠĠ Ġprivate Ġfun Ġupsert C urrencies ( currencies : ĠList < Currency >) Ġ= Ġrepository . upsert C urrencies ( currencies ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Currency ( currency Code : ĠString ) Ġ= Ġrepository . getC urrency ( currency Code ) ĊĊĠĠĠ Ġfun Ġis First Launch () Ġ= Ġrepository . is First Launch ĊĠĠĠ Ġfun Ġset First Launch ( value : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . is First Launch Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdatabase Selected C urrencies Ġ= Ġrepository . getSelected C urrencies () ĊĠĠĠ Ġval Ġmemory Selected C urrencies Ġ= Ġmutable ListOf < Currency >() ĊĠĠĠ Ġval Ġfocused Currency Ġ= ĠMutable LiveData < Currency ?> () ĊĠĠĠ Ġvar Ġwas List Construct ed Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġ[ button ] Ġis Ġa ĠButton Ġwe Ġknow Ġthat Ġbelongs Ġto Ġchars Ġ 0 - 9 Ġor Ġthe Ġdecimal ĊĠĠĠĠ Ġ* Ġseparator Ġas Ġthose Ġwere Ġdeclared Ġas ĠButtons . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġ[ button ] Ġis Ġan ĠImage Button Ġthat Ġcan Ġonly Ġmean Ġthat Ġit Ġis Ġthe Ġback space ĊĠĠĠĠ Ġ* Ġkey Ġas Ġthat Ġwas Ġthe Ġonly Ġone Ġdeclared Ġas Ġan ĠImage Button . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġprocess Keyboard Input ( button : ĠView ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexisting Text Ġ= Ġfocused Currency . value ?. conversion ?. conversion String ĊĠĠĠĠĠĠĠ Ġvar Ġis Input Valid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġwhen Ġ( button ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠButton Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Pressed Ġ= Ġbutton . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinput Ġ= Ġexisting Text Ġ+ Ġkey Pressed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= Ġclean Input ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Input Valid Ġ= Ġis Input Valid ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠImage Button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Text Ġ= Ġexisting Text ?. drop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġexisting Text !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Input Valid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġinput Ġhas Ġa Ġleading Ġdecimal Ġseparator Ġit Ġprefixes Ġit Ġwith Ġa Ġzero . ĊĠĠĠĠ Ġ* ĠIf Ġinput Ġhas Ġa Ġleading Ġ 0 Ġit Ġremoves Ġit . ĊĠĠĠĠ Ġ* ĠExamples : ĠĠ Ġ"." Ġ-> Ġ" 0 ." ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 0 " Ġ-> Ġ" 0 " ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠĠĠ Ġ" 0 7 " Ġ-> Ġ" 0 " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġclean Input ( input : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġclean Input Ġ= Ġinput . replace (",", Ġ". ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"." Ġ== Ġclean Input Ġ-> Ġclean Input Ġ= Ġ" 0 ." ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRegex (" 0 [^ .] "). matches ( clean Input ) Ġ-> Ġclean Input Ġ= Ġinput [ SECOND . position ]. toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclean Input ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Input Valid ( input : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( validate Length ( input ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Decimal Places ( input ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate Decimal Separator ( input )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAss ures Ġthe Ġwhole Ġpart Ġof Ġthe Ġinput Ġis Ġnot Ġabove Ġ 2 0 Ġdigits Ġlong . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvalidate Length ( input : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Digits Allowed Ġ= Ġ 2 0 ĊĠĠĠĠĠĠĠ Ġif Ġ(! input . contains (".") Ġ&& Ġinput . length Ġ> Ġmax Digits Allowed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput . drop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAss ures Ġthe Ġdecimal Ġpart Ġof Ġthe Ġinput Ġis Ġat Ġmost Ġ 4 Ġdigits . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvalidate Decimal Places ( input : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Decimal Places Allowed Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġif Ġ( input . contains (".") Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . substring ( input . indexOf (".") Ġ+ Ġ 1 ). length Ġ> Ġmax Decimal Places Allowed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput . drop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAss ures Ġthe Ġinput Ġcontains Ġat Ġmost Ġ 1 Ġdecimal Ġseparator . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠ Ġprivate Ġfun Ġvalidate Decimal Separator ( input : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdecimal Separator Count Ġ= Ġinput . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. count Ġ{ Ġit Ġ== Ġ'.' Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( decimal Separator Count Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput . drop Last ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Conversions () Ġ{ ĊĠĠĠĠĠĠĠ Ġfocused Currency . value ?. conversion ?. conversion String Ġ= ĠString . EMPTY ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġfocused Currency . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġit . conversion . conversion String Ġ= ĠString . EMPTY Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġthe Ġconversion Ġof Ġall Ġc urrencies Ġagainst Ġthe Ġfocused Ġcurrency 's Ġinput Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrun Conversions () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocused Currency Ġ= Ġfocused Currency . value ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġfocused Currency Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Rate Ġ= Ġfocused Currency !!. exchange Rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Rate Ġ= Ġit . exchange Rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( focused Currency . conversion . conversion String . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversion Value Ġ= ĠCurrency Conversion . convert Currency ( BigDecimal ( focused Currency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. conversion . conversion String . replace (",", Ġ". ")), Ġfrom Rate , Ġto Rate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . conversion . conversion Value Ġ= Ġconversion Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . conversion . conversion String Ġ= ĠString . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġhints Ġof Ġall Ġc urrencies Ġagainst Ġthe Ġfocused Ġcurrency Ġwith Ġvalue Ġof Ġ 1 . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Hints () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocused Currency Ġ= Ġfocused Currency . value ĊĠĠĠĠĠĠĠ Ġfocused Currency !!. conversion . conversion Hint Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġfocused Currency Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfrom Rate Ġ= Ġfocused Currency . exchange Rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Rate Ġ= Ġit . exchange Rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversion Value Ġ= ĠCurrency Conversion . convert Currency ( BigDecimal (" 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Rate , Ġto Rate ). round To Four Decimal Places (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . conversion . conversion Hint Ġ= Ġconversion Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMakes Ġthe Ġcurrency Ġat Ġ[ position Of Clicked Currency ] Ġfocused Ġand Ġthe Ġpreviously Ġfocused ĊĠĠĠĠ Ġ* Ġcurrency Ġun focused . ĠIf Ġthe Ġpreviously Ġfocused Ġcurrency Ġwas Ġremoved Ġit Ġwill Ġnot Ġbe Ġin Ġthe ĊĠĠĠĠ Ġ* Ġlist Ġand Ġthe Ġposition Ġwill Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġchange Focused Currency ( position Of Clicked Currency : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclicked Currency Ġ= Ġmemory Selected C urrencies [ position Of Clicked Currency ] ĊĠĠĠĠĠĠĠ Ġval Ġposition Of Previous ly Focused Currency Ġ= Ġmemory Selected C urrencies . indexOf ( focused Currency . value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( position Of Previous ly Focused Currency . isValid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies [ position Of Previous ly Focused Currency ]. is Focused Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġclicked Currency ĊĠĠĠĠĠĠĠ Ġclicked Currency . is Focused Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġfocus Ġto Ġthe Ġfirst Ġcurrency Ġif Ġthe Ġlist Ġis Ġnot Ġempty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠsetDefault Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( focused Currency . value Ġ== Ġnull Ġ&& Ġmemory Selected C urrencies . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġmemory Selected C urrencies . take ( 1 ). single (). also Ġ{ Ġfirst Currency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Currency . is Focused Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Remove ( currency ToRemove : ĠCurrency , Ġposition Of Currency ToRemove : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġshift C urrencies Up ( position Of Currency ToRemove ) ĊĠĠĠĠĠĠĠ Ġre assign Focused Currency ( position Of Currency ToRemove ) ĊĠĠĠĠĠĠĠ Ġcurrency ToRemove . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrency ToRemove . order Ġ= ĠINVALID . position ĊĠĠĠĠĠĠĠ Ġupsert Currency ( currency ToRemove ) ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . remove ( currency ToRemove ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Undo ( currency To Restore : ĠCurrency , Ġposition Of Currency To Restore : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrency To Restore . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġcurrency To Restore . order Ġ= Ġposition Of Currency To Restore ĊĠĠĠĠĠĠĠ Ġupsert Currency ( currency To Restore ) ĊĠĠĠĠĠĠĠ Ġshift C urrencies Down ( position Of Currency To Restore ) ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . add ( position Of Currency To Restore , Ġcurrency To Restore ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHere Ġwe Ġare Ġre assign ing Ġthe Ġfocus Ġto Ġanother Ġcurrency Ġif Ġthe Ġfocused Ġcurrency Ġis Ġremoved . ĊĠĠĠĠ Ġ* ĠThe Ġre assignment Ġlogic Ġis Ġas Ġfollows : ĊĠĠĠĠ Ġ* ĠĠĠĠĠ ĠIf Ġthere Ġare Ġitems Ġbelow Ġme : ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠ ĠUn focus Ġme , Ġfocus Ġthe Ġitem Ġdirectly Ġbelow Ġme . ĊĠĠĠĠ Ġ* ĠĠĠĠĠ ĠElse Ġif ĠI Ġam Ġthe Ġsole Ġitem : ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠ ĠUn focus Ġme . ĊĠĠĠĠ Ġ* ĠĠĠĠĠ ĠElse : ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠ ĠUn focus Ġme , Ġfocus Ġthe Ġitem Ġdirectly Ġabove Ġme . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġre assign Focused Currency ( position Of Long Clicked Currency : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġremoved Currency Ġ= Ġmemory Selected C urrencies [ position Of Long Clicked Currency ] ĊĠĠĠĠĠĠĠ Ġif Ġ( focused Currency . value Ġ== Ġremoved Currency ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . isNot Last Element ( position Of Long Clicked Currency ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . element After ( position Of Long Clicked Currency ). let Ġ{ Ġnewly Focused Currency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewly Focused Currency . is Focused Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Currency . is Focused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġnewly Focused Currency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . has Only One Element () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . element Before ( position Of Long Clicked Currency ). let Ġ{ Ġnewly Focused Currency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnewly Focused Currency . is Focused Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Currency . is Focused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġnewly Focused Currency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġthe Ġc urrencies Ġbelow Ġthe Ġremoved Ġcurrency Ġare Ġshifted Ġup Ġone Ġposition Ġto Ġfill Ġin Ġthe Ġgap . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshift C urrencies Up ( order Of Currency ToRemove : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Ġloop @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. reversed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcurrency Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currency . order Ġ== Ġorder Of Currency ToRemove ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ loop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency . order -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert Currency ( currency ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAll Ġc urrencies Ġbelow Ġthe Ġrestored Ġcurrency Ġare Ġshifted Ġdown Ġone Ġposition Ġto Ġmake Ġroom . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshift C urrencies Down ( position Of Currency To Restore : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġposition Of Currency To Restore Ġuntil Ġmemory Selected C urrencies . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmemory Selected C urrencies [ i ]. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . order ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert Currency ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġindicates Ġthe Ġuser Ġadded Ġa Ġcurrency Ġby Ġselecting Ġit Ġfrom Ġthe ĠSelect able C urrencies Fragment ĊĠĠĠĠ Ġ* Ġthat Ġwas Ġinitiated Ġby Ġthe Ġclick Ġof Ġthe ĠFloating ActionButton . ĊĠĠĠĠ Ġ* ĠThe Ġindication Ġis Ġtriggered Ġwhen , Ġthe Ġonly Ġdifference Ġbetween Ġ[ database Selected C urrencies ] Ġand ĊĠĠĠĠ Ġ* Ġ[ memory Selected C urrencies ] Ġis Ġthat Ġ[ database Selected C urrencies ] Ġhas Ġan Ġextra Ġelement . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwas Currency Added Via Fab ( database Selected C urrencies : ĠList < Currency >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( database Selected C urrencies . size Ġ- Ġmemory Selected C urrencies . size Ġ== Ġ 1 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Selected C urrencies . drop Last ( 1 ) Ġ== Ġmemory Selected C urrencies ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOn Ġthe Ġdrag Ġevents , Ġadjacent Ġc urrencies Ġneed Ġto Ġswap Ġposition Ġindices Ġand Ġthis Ġneeds Ġto Ġbe ĊĠĠĠĠ Ġ* Ġreflected Ġin Ġmemory Ġand Ġin Ġthe Ġdatabase . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġswap C urrencies ( first Position : ĠInt , Ġsecond Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ first Position ]. order Ġ= Ġthis [ second Position ]. order . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ second Position ]. order Ġ= Ġthis [ first Position ]. order ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ first Position ] Ġ= Ġthis [ second Position ]. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis [ second Position ] Ġ= Ġthis [ first Position ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert C urrencies ( listOf ( this [ first Position ], Ġthis [ second Position ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove All C urrencies () Ġ{ ĊĠĠĠĠĠĠĠ Ġfocused Currency . value Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . order Ġ= ĠINVALID . position ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġc urrencies ToRemove Ġ= Ġmutable ListOf < Currency >() ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc urrencies ToRemove . add ( it . copy ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġupsert C urrencies ( currencies ToRemove ) ĊĠĠĠĠĠĠĠ Ġmemory Selected C urrencies . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSelect s Ġa Ġset Ġof Ġdefault Ġc urrencies Ġon Ġthe Ġfirst Ġlaunch Ġof Ġthe Ġapp Ġbased Ġon Ġthe Ġuser 's Ġlocale . ĊĠĠĠĠ Ġ* ĠLogic : ĠIf Ġthe Ġuser 's Ġlocale Ġis ĠUS , Ġit Ġselects Ġthe ĠUS Ġdollar Ġand Ġthe Ġthree Ġother Ġmost Ġused ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ Ġc urrencies Ġwhich Ġare Ġthe ĠE uro , ĠJapanese ĠY en , Ġand ĠBrit ish ĠP ound . ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠ ĠElse , Ġit Ġselects Ġthe ĠUS Ġdollar Ġthe Ġthe Ġuser 's Ġlocal Ġcurrency . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit Default C urrencies () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is First Launch ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Currency Code Ġ= Ġ" USD _${ java . util . Currency . getInstance ( Locale . getDefault ()). currency Code }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault C urrencies Ġ= Ġmutable ListOf < Currency >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Currency (" USD _ USD "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault C urrencies . add ( setDefault Currency ( this , ĠFIRST . position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Currency Ġ= Ġget Currency ( local Currency Code ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( local Currency Code Ġ== Ġ" USD _ USD ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Currency (" USD _ EUR "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault C urrencies . add ( setDefault Currency ( this , ĠSE COND . position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Currency (" USD _ J PY "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault C urrencies . add ( setDefault Currency ( this , ĠTH IRD . position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Currency (" USD _ GBP "). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault C urrencies . add ( setDefault Currency ( this , ĠFO UR TH . position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Currency . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault C urrencies . add ( setDefault Currency ( this , ĠSE COND . position )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupsert C urrencies ( default C urrencies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetDefault Currency ( currency : ĠCurrency , Ġorder : ĠInt ): ĠCurrency Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrency . order Ġ= Ġorder ĊĠĠĠĠĠĠĠ Ġcurrency . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrency ĊĠĠĠ Ġ} Ċ }