package Ġfr . core nt ing . convert isse ure uro fr anc Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . view Models Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . app . AppCompat Delegate Ċ import Ġandroidx . core . widget . do On TextChanged Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . converters . Converter Abstract Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . converters . Fr ance Converter Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . converters . UK Converter Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . converters . USA Converter Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . databinding . Activity Converter Binding Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . utils . Theme Utils Ċ import Ġfr . core nt ing . convert isse ure uro fr anc . utils . Utils Ċ import Ġjava . util .* Ċ Ċ class ĠConverter Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Converter Binding ĊĊĠĠĠ Ġprivate Ġval Ġconverter s Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠUSA Converter :: class . java Ġto Ġ 0 , ĊĠĠĠĠĠĠĠ ĠUK Converter :: class . java Ġto Ġ 1 , ĊĠĠĠĠĠĠĠ ĠFrance Converter :: class . java Ġto Ġ 2 , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTheme Ġand Ġcreation ĊĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( Theme Utils . get Theme ToUse ( this )) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠBinding Ġand Ġview ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Converter Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġbinding . root ĊĠĠĠĠĠĠĠ ĠsetContentView ( view ) ĊĠĠĠĠĠĠĠ Ġbinding . top AppBar . setOn MenuItem ClickListener ( this :: on MenuItem ClickListener ) ĊĠĠĠĠĠĠĠ Ġbinding . top AppBar . menu . find Item ( Theme Utils . get Menu Id For Current Theme ( this )). isChecked Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠCommon Ġvalues ĊĠĠĠĠĠĠĠ Ġval Ġc urrencies List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . usa _ currencies ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . uk _ currencies ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . france _ currencies ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSum Ġinput ĊĠĠĠĠĠĠĠ Ġbinding . sum To Convert Text . do On TextChanged Ġ{ Ġtext , Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . toString (). toFloat () Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠView model Ġand Ġconverter Ġsetup ĊĠĠĠĠĠĠĠ Ġval Ġconverter ViewModel : ĠConverter ViewModel Ġby Ġview Models Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConverter ViewModel Factory ( Utils . get Converter For Current Locale ( application Context )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconverter ViewModel . get Converter (). observe ( this , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Converter Change ( it ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġselected Ġin Ġlist Ġ( used Ġat Ġapp Ġopening ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . currency Auto Complete . setText ( currencies List [ converters [ it :: class . java ] Ġ?: Ġ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Set Ġcurrency Ġspinner Ġcontent ĊĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠAuto Complete Adapter ( this , ĠR . layout . list _ item , Ġc urrencies List ) ĊĠĠĠĠĠĠĠ Ġbinding . currency Auto Complete . setAdapter ( adapter ) ĊĠĠĠĠĠĠĠ Ġbinding . currency Auto Complete . setOn ItemClickListener Ġ{ Ġ_, Ġ_, Ġposition , Ġ_ Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverter Class Ġ= Ġconverter s . entries . associate Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġvalue Ġto Ġkey Ġ} [ position ] Ġ?: ĠUSA Converter :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverter Ġ= Ġconverter Class . construct ors [ 0 ]. newInstance ( application Context ) Ġas ĠConverter Abstract ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconverter ViewModel . set Converter ( converter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Buttons ( converter ViewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Converter Change ( new Converter : ĠConverter Abstract ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlatest Year Ġ= Ġnew Converter . latest Year ĊĠĠĠĠĠĠĠ Ġval Ġfirst Year Ġ= Ġnew Converter . first Year ĊĊĠĠĠĠĠĠĠ Ġbinding . year Of Origin Auto Complete . setText ( latest Year . toString ()) ĊĠĠĠĠĠĠĠ Ġbinding . year Of Origin Input . hint Ġ= ĠgetString ( R . string . year Of Origin , Ġfirst Year , Ġlatest Year ) ĊĠĠĠĠĠĠĠ Ġbinding . year Of Origin Auto Complete . do On TextChanged Ġ{ Ġtext , Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠYear Input Text Handler . do On TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Converter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Origin Auto Complete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Origin Input ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġtext . toString (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . hint Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sum To Convert , Ġnew Converter . getC urrency From Year ( year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . hint Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . sum To Convert , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Converter . getC urrency From Year ( latest Year ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbinding . year Of Result Auto Complete . setText ( latest Year . toString ()) ĊĠĠĠĠĠĠĠ Ġbinding . year Of Result Input . hint Ġ= ĠgetString ( R . string . year Of Origin , Ġfirst Year , Ġlatest Year ) ĊĠĠĠĠĠĠĠ Ġbinding . year Of Result Auto Complete . do On TextChanged Ġ{ Ġtext , Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠYear Input Text Handler . do On TextChanged ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapplication Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Converter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Result Auto Complete , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Result Input ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Ġ= Ġtext . toString (). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . result Input . hint Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . result Text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Converter . getC urrency From Year ( year ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . result Input . hint Ġ= ĠgetString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . result Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Converter . getC urrency From Year ( latest Year ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon MenuItem ClickListener ( menuItem : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( menuItem . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ about Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . show Credits ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . action _ theme _ system , ĠR . id . action _ theme _ light , ĠR . id . action _ theme _ dark Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTheme Utils . save Theme Preference ( this , Ġmenu Item . itemId ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAppCompat Delegate . setDefault Night Mode ( Theme Utils . get Theme ToUse ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Buttons ( converter ViewModel : ĠConverter ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Convert Ġwhen Ġthe Ġbutton Ġis Ġclicked ĊĠĠĠĠĠĠĠ Ġbinding . convert Button . set I me Action Label ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . convert Button ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . KEYCODE _ ENTER ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Click Ġbutton Ġwhen Ġusing Ġenter Ġon Ġthe Ġkeyboard ĊĠĠĠĠĠĠĠ Ġbinding . sum To Convert Text . setOn Key Listener ( View . On Key Listener Ġ{ Ġ_, Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ== ĠKeyEvent . ACTION _ DOWN Ġ&& Ġevent . keyCode Ġ== ĠKeyEvent . KEYCODE _ ENTER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . convert Button . perform Click () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Key Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Setup Ġlisteners ĊĠĠĠĠĠĠĠ Ġbinding . convert Button . setOnClickListener Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . convert Button . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Origin Auto Complete . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . year Of Result Auto Complete . clear Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . hide Soft Keyboard ( v ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Conversion ( converter ViewModel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdo Conversion ( converter ViewModel : ĠConverter ViewModel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . error Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Of Origin Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . parseInt ( binding . year Of Origin Auto Complete . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġyear Of Result Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger . parseInt ( binding . year Of Result Auto Complete . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= Ġjava . lang . Float . parseFloat ( binding . sum To Convert Text . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconverted Amount Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter ViewModel . do Conversion ( year Of Origin , Ġyear Of Result , Ġamount ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . result Text . setText ( Utils . format Number ( this , Ġconverted Amount )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( binding . sum To Convert Text . text Ġ== Ġnull Ġ|| Ġbinding . sum To Convert Text . text . toString () Ġ== Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . sum To Convert Input . error Ġ= ĠgetString ( R . string . no _ amount _ enter ed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠgetString ( R . string . error Toast ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ