package Ġcom . die gop arra . ve gg ie . products . app . ui Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġco il . load Ċ import Ġcom . die gop arra . ve gg ie . R Ċ import Ġcom . die gop arra . ve gg ie . core . android . getResources From Attr Ċ import Ġcom . die gop arra . ve gg ie . core . android . setBackground Ċ import Ġcom . die gop arra . ve gg ie . databinding . ListItem Cart Binding Ċ import Ġcom . die gop arra . ve gg ie . products . app . entities . Product Cart Ċ import Ġcom . die gop arra . ve gg ie . products . cart . domain . ProductId Ċ import Ġcom . die gop arra . ve gg ie . core . kotlin . add Price Format Ċ import Ġcom . die gop arra . ve gg ie . products . domain . Label Ċ import Ġcom . die gop arra . ve gg ie . products . app . ui . utils . load Product Label Ċ import Ġcom . die gop arra . ve gg ie . products . app . ui . utils . set Quantity State Ċ import Ġtim ber . log . Tim ber Ċ Ċ class ĠCart Adapter ( private Ġval Ġlistener : ĠOn ItemClickListener ) Ġ: ĊĠĠĠ ĠList Adapter < Product Cart , ĠCart Adapter . ViewHolder >( Diff Callback ) Ġ{ ĊĊĠĠĠ Ġinterface ĠOn ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠBUTTON _ ADD Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠBUTTON _ RED UCE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠVIEW _ QU ANT ITY Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Item Click ( productId : ĠProduct Id , Ġposition : ĠInt , Ġwhich : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListItem Cart Binding . inflate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayoutInflater . from ( parent . context ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproduct Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠ Ġholder . bind ( product ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt , Ġpayload s : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payload s . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġpayload s . last () Ġas ĠBundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind From Payload ( payload ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Bind ViewHolder ( holder , Ġposition , Ġpayload s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠViewHolder ( ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbinding : ĠListItem Cart Binding , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener : ĠOn ItemClickListener ĊĠĠĠ Ġ) Ġ: ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitem : ĠProduct Cart ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Add . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Item Click ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠproductId Ġ= Ġit . productId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġbinding Adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġ= ĠOn ItemClickListener . BUTTON _ ADD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Item Click ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠproductId Ġ= Ġit . productId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġbinding Adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġ= ĠOn ItemClickListener . BUTTON _ RED UCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Item Click ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠproductId Ġ= Ġit . productId , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġbinding Adapter Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġ= ĠOn ItemClickListener . VIEW _ QU ANT ITY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( product : ĠProduct Cart ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Ġ= Ġproduct ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Image ( product . imageUrl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Label ( product . label ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Name ( product . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Description ( product . packet , Ġproduct . detail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Total ( product . price , Ġproduct . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Quantity State ( product . quantity , Ġproduct . max Order ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Editable State ( product . is Editable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind From Payload ( payload : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" bind From Payload () Ġcalled Ġwith : Ġpayload Ġ= Ġ$ payload ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payload . containsKey ( Payload Constants . QU ANT ITY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquantity Ġ= Ġpayload . getInt ( Payload Constants . QU ANT ITY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Total ( payload . getInt ( Payload Constants . PRICE ), Ġquantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate New Total ( payload . getBoolean ( Payload Constants . QU ANT ITY _ INCRE ASE D )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Quantity State ( quantity , Ġpayload . getInt ( Payload Constants . MAX _ ORDER )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payload . containsKey ( Payload Constants . EDIT ABLE )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Editable State ( payload . getBoolean ( Payload Constants . EDIT ABLE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Image ( imageUrl : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . image . load ( imageUrl ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Label ( label : ĠLabel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . label . load Product Label ( label ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Name ( name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . name . text Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Description ( packet : ĠString , Ġdetail : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description . text Ġ= Ġpacket Ġ+ Ġ( detail ?. let Ġ{ Ġ" ĠâĢ¢ Ġ$ it " Ġ} Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" SetText I 1 8 n ") ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Total ( price : ĠInt , Ġquantity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . price . text Ġ= Ġ" Total : Ġ" Ġ+ Ġ( price Ġ* Ġquantity ). add Price Format () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ĠThis Ġvariables Ġneed Ġto Ġbe Ġoutside Ġthe Ġmethod , Ġif ĠI Ġput Ġinside Ġsome Ġbug Ġis Ġorigin ated , ĊĠĠĠĠĠĠĠ Ġ// Ġ Ġand Ġcolor Ġwill Ġnot Ġreturn Ġto Ġits Ġoriginal Ġwhen Ġpressed Ġqty button Ġtwice Ġfast . ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoriginal Color Ġ= Ġbinding . price . current TextColor ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġoriginal Alpha Ġ= Ġbinding . price . alpha ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġanimate New Total ( qty Increase d : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . price ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. animate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Start Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( binding . price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Attr Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qty Increase d ) ĠR . attr . color Primary Ġelse ĠR . attr . color Secondary ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( context . getResources From Attr ( color Attr )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġ 1 . 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with End Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( binding . price ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextColor ( original Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġoriginal Alpha ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Quantity State ( quantity : ĠInt , Ġmax Order : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( binding . btn Add , Ġbinding . btn Reduce ). set Quantity State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquantity Ġ= Ġquantity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Order Ġ= Ġmax Order ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . text Ġ= Ġquantity . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Editable State ( editable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( editable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Add . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . setBackground ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Add . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . setBackground ( R . drawable . circle _ outline ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠDiff Callback Ġ: ĠDiff Util . Item Callback < Product Cart >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠProduct Cart , Ġnew Item : ĠProduct Cart ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item . productId Ġ== Ġnew Item . productId ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠProduct Cart , Ġnew Item : ĠProduct Cart ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Change Payload ( old Item : ĠProduct Cart , Ġnew Item : ĠProduct Cart ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Item . quantity Ġ!= Ġnew Item . quantity ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Payload Constants . QU ANT ITY , Ġnew Item . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPayload Constants . QU ANT ITY _ INCRE ASE D , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Item . quantity Ġ> Ġold Item . quantity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Payload Constants . MAX _ ORDER , Ġnew Item . max Order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Payload Constants . PRICE , Ġnew Item . price ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Item . is Editable Ġ!= Ġnew Item . is Editable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Boolean ( Payload Constants . EDIT ABLE , Ġnew Item . is Editable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobject ĠPayload Constants Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠQU ANT ITY Ġ= Ġ" quantity " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠQU ANT ITY _ INCRE ASE D Ġ= Ġ" qty _ increase d " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ ORDER Ġ= Ġ" max Order " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠPR ICE Ġ= Ġ" price " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠEDIT ABLE Ġ= Ġ" editable " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }