package Ġcom . tun aso ftware . t una ui . select Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . lifecycle .* Ċ import Ġcom . tun aso ftware . android . T una Ċ import Ġcom . tun aso ftware . t una . entities . T una Payment MethodType Ċ import Ġcom . tun aso ftware . tun ac om mon s . ui . entities . UIState Ċ import Ġcom . tun aso ftware . tun akt . delete Card Ċ import Ġcom . tun aso ftware . tun akt . get Card List Ċ import Ġcom . tun aso ftware . tun akt . get Payment Methods Ċ import Ġcom . tun aso ftware . t una ui . R Ċ import Ġcom . tun aso ftware . t una ui . domain . entities . T una Card Flag Ċ import Ġcom . tun aso ftware . t una ui . domain . entities . T una UIC ard Ċ import Ġcom . tun aso ftware . t una ui . extensions . default Ċ import Ġcom . tun aso ftware . t una ui . utils . Single Live Event Ċ import Ġcom . tun aso ftware . t una ui . utils . announce For Accessibility Ċ import Ġkotlinx . coroutines . launch Ċ Ċ class ĠSelect PaymentMethod ViewModel ( val Ġt una : ĠT una ) Ġ: ĠViewModel () Ġ{ ĊĊĠĠĠ Ġval Ġactions LiveData Ġ= ĠSingle Live Event < Any >() ĊĠĠĠ Ġval Ġstate Ġ= ĠMutable LiveData < UIState < List < PaymentMethod >>> (). default ( UIState . Loading ) ĊĊĠĠĠ Ġprivate Ġvar Ġ_ isInitialized Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġ_ payments LiveData Ġ= ĠMutable LiveData < List < PaymentMethod >>() ĊĠĠĠ Ġprivate Ġval Ġ_ cards LiveData Ġ= ĠMutable LiveData < List < PaymentMethod >>() ĊĠĠĠ Ġprivate Ġval Ġ_ payments Mediator LiveData Ġ= ĠMed iator LiveData < List < PaymentMethod >> (). apply Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġcards : ĠList < PaymentMethod >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġpayments Ġ: ĠList < PaymentMethod >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġverify (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Cards Ġ= Ġcards ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Payments Ġ= Ġpayments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Cards Ġ!= Ġnull Ġ&& Ġm Payments Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġm Cards Ġ+ Ġm Payments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Source (_ payments LiveData ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayments Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Source (_ cards LiveData ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcards Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpayments Observer Ġ= ĠObserver < List < PaymentMethod >> { ĊĠĠĠĠĠĠĠ Ġstate . post Value ( UIState . Success ( it )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit () Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(!_ isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ isInitialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ payments Mediator LiveData . observe Fore ver ( payments Observer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt una . get Card List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Method CreditCard ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Type Ġ= ĠPayment MethodType . CRED IT _ CARD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġit . masked Number , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Swipe Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= ĠT una Card Flag . from Brand ( it . brand ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt una UIC ard Ġ= Ġit . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT una UIC ard ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġit . token , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrand Ġ= Ġit . brand , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcard Holder Name Ġ= Ġit . card Holder Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Month Ġ= Ġit . expiration Month , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpiration Year Ġ= Ġit . expiration Year , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmasked Number Ġ= Ġit . masked Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect First Card ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġhandle Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ cards LiveData . post Value ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġt una . get Payment Methods () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ Ġlist Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ payments LiveData . post Value ( list . map Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayment Method ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Type Ġ= Ġwhen Ġ( it . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT una Payment MethodType . CRED IT _ CARD Ġ-> ĠPayment MethodType . NEW _ CRED IT _ CARD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT una Payment MethodType . BANK _ S LI P Ġ-> ĠPayment MethodType . BANK _ S LI P ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġit . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Swipe Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ Ġerror Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO : Ġhandle Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ payments LiveData . post Value ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonDelete Card ( payment Method : PaymentMethod CreditCard , Ġcontext : ĠContext ?) Ġ= ĠviewModel Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcards Ġ= Ġ( it . to Mutable List () Ġ- Ġpayment Method ). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payment Method . selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect First Card ( cards ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ cards LiveData . value Ġ= Ġcards ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext ?. announce For Accessibility ( context . getString ( R . string . t una _ accessibility _ re moving _ card )) ĊĊĠĠĠĠĠĠĠ Ġt una . delete Card ( payment Method . t una UIC ard . token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġbe Ġdone , ĠUI Ġhas Ġalready Ġremoved Ġthe Ġitem Ġfrom Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. announce For Accessibility ( context . getString ( R . string . t una _ accessibility _ removed _ card )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Failure Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactions LiveData . post Value ( Action Show Error Deleting Card ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon PaymentMethod Selected ( payment Method : ĠPayment Method ){ ĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle PaymentMethod Selected ( it , Ġpayment Method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon New Card Added ( payment Method : ĠPayment Method ){ ĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value ?. let Ġ{ ĠlistOf ( payment Method ) Ġ+ Ġit Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle PaymentMethod Selected ( it , Ġpayment Method ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠonSubmit Click (){ ĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value ?. first OrNull Ġ{ Ġit . selected Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactions LiveData . post Value ( Action On PaymentMethod Selected ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Cle ared () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ payments Mediator LiveData . remove Observer ( payments Observer ) ĊĠĠĠĠĠĠĠ Ġsuper . on Cle ared () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect First Card ( list : ĠList < PaymentMethod >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġlist . to Mutable List () ĊĠĠĠĠĠĠĠ Ġif Ġ( list . none Ġ{ Ġit . selected Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . first OrNull Ġ{ Ġit . selectable Ġ} ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected PaymentMethod ( list , Ġnew List , Ġthis , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value Ġ= Ġnew List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle PaymentMethod Selected ( list : ĠList < PaymentMethod >, Ġpayment Method : ĠPayment Method ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew List Ġ= Ġlist . to Mutable List () ĊĠĠĠĠĠĠĠ Ġif Ġ( payment Method . selectable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . find Ġ{ Ġit . selected Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected PaymentMethod ( list , Ġnew List , Ġit , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetSelected PaymentMethod ( list , Ġnew List , Ġpayment Method , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ cards LiveData . value Ġ= Ġnew List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetSelected PaymentMethod ( list : ĠList < PaymentMethod >, Ġnew List : ĠMutable List < PaymentMethod >, Ġpayment Method : ĠPayment Method , Ġselected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġlist . indexOf ( payment Method ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġcopy PaymentMethod ( payment Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem . selected Ġ= Ġselected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew List [ index ] Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy PaymentMethod ( payment Method : ĠPayment Method ): ĠPayment Method Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payment Method Ġis ĠPayment Method CreditCard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPayment Method CreditCard ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Type Ġ= Ġpayment Method . method Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġpayment Method . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Swipe Ġ= Ġpayment Method . disable Swipe , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect able Ġ= Ġpayment Method . selectable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġpayment Method . selected , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Ġ= Ġpayment Method . flag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt una UIC ard Ġ= Ġpayment Method . t una UIC ard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPayment Method ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod Type Ġ= Ġpayment Method . method Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠdisplayName Ġ= Ġpayment Method . displayName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Swipe Ġ= Ġpayment Method . disable Swipe , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect able Ġ= Ġpayment Method . selectable , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Ġ= Ġpayment Method . selected ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠAction Show Error Deleting Card Ċ data Ġclass ĠAction On PaymentMethod Selected ( val Ġpayment Method : ĠPayment Method ) ĊĊ