/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 . Ċ Ġ* ĠDesign ed Ġand Ġdeveloped Ġby Ġ@ qu ab yn ah _ code labs Ġ( D enn is ĠB il son ) Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . world of lux ury . view . cart Ċ Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . nav Graph ViewModels Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . sky do ves . what if . what If NotNull Ċ import Ġcom . stripe . android . Customer Session Ċ import Ġcom . stripe . android . Ep hemeral Key Provider Ċ import Ġcom . stripe . android . Payment Session Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġio . world of lux ury . R Ċ import Ġio . world of lux ury . data . Product Ċ import Ġio . world of lux ury . databinding . Fragment Cart Binding Ċ import Ġio . world of lux ury . databinding . Item Cart Binding Ċ import Ġio . world of lux ury . view model . Checkout Progress Ċ import Ġio . world of lux ury . view model . Payment ViewModel Ċ import Ġio . world of lux ury . view model . Product ViewModel Ċ import Ġio . world of lux ury . view model . factory . Payment ViewModel Factory Ċ import Ġio . world of lux ury . view model . factory . Product ViewModel Factory Ċ import Ġtim ber . log . Tim ber Ċ import Ġjavax . inject . Inject Ċ Ċ @ Android EntryPoint Ċ class ĠCart Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Cart Binding ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġadapter : ĠCart Items Adapter ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġfactory : ĠProduct ViewModel Factory ĊĠĠĠ Ġprivate Ġval ĠviewModel Ġby Ġnav Graph ViewModels < Product ViewModel >( R . id . w ol _ nav _ graph ) Ġ{ Ġfactory Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġpayment ViewModel Factory : ĠPayment ViewModel Factory ĊĠĠĠ Ġprivate Ġval Ġpayment VM Ġby Ġnav Graph ViewModels < Payment ViewModel >( R . id . w ol _ nav _ graph ) Ġ{ Ġpayment ViewModel Factory Ġ} ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġkey Provider : ĠEp hemeral Key Provider ĊĊĠĠĠ Ġprivate Ġval Ġpayment Session : ĠPayment Session Ġby Ġlazy ( Lazy Thread Safety Mode . SYN CH RON IZED ) Ġ{ ĊĠĠĠĠĠĠĠ ĠPayment Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayment VM . payment Config ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠCustomer Session . init Customer Session ( require Context (), Ġkey Provider ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Cart Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Owner Ġ= Ġthis @ Cart Fragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct ViewModel Ġ= ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession Ġ= Ġpayment Session ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayment ViewModel Ġ= Ġpayment VM ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsetup Ġre cycler view ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠCart Items Adapter ( viewModel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfav Items List . adapter Ġ= Ġadapter ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġobserve Ġproducts ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . favorites . observe ( view Lifecycle Owner , Ġ{ Ġproducts Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Products Ġ-> Ġ$ products ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( products ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" There Ġare Ġ${ adapter . item Count } Ġitems Ġin Ġthis Ġlist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġobserve Ġpayment Ġmodule Ġsupport ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayment VM . supports Payment Module . observe ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Payment Ġmodule Ġsupport Ġ-> Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġobserve Ġmessages Ġf ro Ġtransaction ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . toast LiveData . observe ( view Lifecycle Owner , Ġ{}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġobserve Ġcheckout Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayment VM . live Checkout Progress . observe ( view Lifecycle Owner , Ġ{ Ġstate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . i (" Checkout Ġstate Ġ-> Ġ$ state ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCheckout Progress . ON _ SUCCESS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . clear Shopping Cart () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* do Ġnothing */ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġdata . what If NotNull Ġ{ Ġpayment Session . handle Payment Data ( request Code , ĠresultCode , Ġit ) Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // Ġadapter Ġfor Ġre cycler view Ċ class ĠCart Items Adapter Ġconstructor ( private Ġval ĠviewModel : ĠProduct ViewModel ) Ġ: ĊĠĠĠ ĠList Adapter < Product , ĠCart Item ViewHolder >( Product . PRODUCT _ DIFF ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠCart Item ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠItem Cart Binding . inflate ( LayoutInflater . from ( parent . context ), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCart Item ViewHolder ( binding , ĠviewModel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠCart Item ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . bind ( getItem ( position )) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ // Ġview holder Ġfor Ġitems Ċ class ĠCart Item ViewHolder Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġbinding : ĠItem Cart Binding , ĊĠĠĠ Ġprivate Ġval Ġproduct ViewModel : ĠProduct ViewModel Ċ ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĊĠĠĠ Ġfun Ġbind ( item : ĠProduct ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Ġ= Ġproduct ViewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }