package Ġio . github . aman sh ura ik war . k rypt on ite . ui Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Array Adapter Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdagger . android . support . D agger AppCompatActivity Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . R Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . add Error Text Watcher Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . data . domain . result . Event Observer Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . ui . list . Exchange Rate ListItem Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . ui . list . Header ListItem Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . ui . list . RecyclerView Type Factory Generated Ċ import Ġio . github . aman sh ura ik war . k rypt on ite . viewModel Provider Ċ import Ġio . github . aman sh ura ik war . multi item list adapter . Multi Item Adapter Ċ import Ġio . github . aman sh ura ik war . multi item list adapter . RecyclerView ListItem Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġorg . th reet en . bp . format . DateTime Formatter Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠMainActivity Ġ: ĠD agger AppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ@ Inject Ġlateinit Ġvar ĠviewModel Factory : ĠViewModel Provider . Factory ĊĊĠĠĠ Ġlateinit Ġvar ĠviewModel : ĠMain ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ ĠviewModel Ġ= ĠviewModel Provider ( viewModel Factory ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . display Supported C urrencies . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠArray Adapter < String >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĠR . layout . item _ drop _ down , Ġit . map Ġ{ Ġit . code Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Spinner . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . loading . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpb . visibility Ġ= Ġif Ġ( it ) ĠView . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Et . isEnabled Ġ= Ġ! it ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrency Spinner . isEnabled Ġ= Ġ! it ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . display Exchange Rates . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Rv . adapter Ġ= ĠMulti Item Adapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecyclerView Type Factory Generated (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < RecyclerView ListItem >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġamount Ġ= Ġamount Et . text . toString (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Header ListItem (" Exchange ĠR ates ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeader ListItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Last ĠUpdated : Ġ${ it [ 0 ]. last Updated . format ( DateTime Formatter . of Pattern (" hh : mm Ġa , Ġdd - MMMM - yyyy ")) }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExchange Rate ListItem ( it , Ġamount ) Ġas ĠRecyclerView ListItem ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Header ListItem (" That 's ĠAll ĠFol ks ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠviewModel . show Sn ackBar . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Observer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currency Spinner . adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Retry Snackbar ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġitems Rv . layout Manager Ġ= ĠLinearLayoutManager ( this ) ĊĊĠĠĠĠĠĠĠ Ġsearch E fab . setOnClickListener Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( amount Et . text . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Til . error Ġ= Ġ" Enter Ġamount ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Currency Ġ= Ġ( currency Spinner . selected View Ġas ĠTextView ). text . toString () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . search Exchange Rates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Et . text . toString (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Currency ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġamount Et . add Error Text Watcher ( amount Til ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġactivity Ġwas Ġre created ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġc urrencies Ġwere Ġnot Ġloaded Ġyet ĊĠĠĠĠĠĠĠ Ġ// Ġload Ġthem Ġagain ĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currency Spinner . adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . get Supported C urrencies () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Snackbar ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( parent Cl , Ġmsg , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Retry Snackbar ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. make ( parent Cl , Ġmsg , ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Action (" Retry ") Ġ{ ĠviewModel . get Supported C urrencies () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} Ċ } Ċ