package Ġcom . die gop arra . ve gg ie . products . app . ui Ċ Ċ 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 Ġcom . die gop arra . ve gg ie . R Ċ import Ġcom . die gop arra . ve gg ie . databinding . ListItem Variation Header Binding Ċ import Ġcom . die gop arra . ve gg ie . databinding . ListItem Variation Item Binding Ċ import Ġcom . die gop arra . ve gg ie . products . app . entities . Product Variation Ċ import Ġcom . die gop arra . ve gg ie . products . app . ui . utils . get Formatted Price Ċ import Ġcom . die gop arra . ve gg ie . products . app . ui . utils . load Enabled State Ċ import Ġjava . lang . IllegalArgumentException Ċ Ċ private Ġconst Ġval ĠHEADER Ġ= ĠR . layout . list _ item _ variation _ header Ċ private Ġconst Ġval ĠITEM Ġ= ĠR . layout . list _ item _ variation _ item Ċ Ċ class ĠVari ations Adapter ( private Ġval Ġlistener : ĠOn ItemClickListener ) Ġ: ĊĠĠĠ ĠList Adapter < Variation Ui , ĠVari ations Adapter . ViewHolder >( Diff Callback ) Ġ{ ĊĊĠĠĠ Ġinterface ĠOn ItemClickListener Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠBUTTON _ ADD Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠBUTTON _ RED UCE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Item Click ( variation Id : ĠString , Ġdetail : ĠString ?, Ġwhich : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsubmit Vari ations List ( list : ĠList < Product Variation >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlist To Submit Ġ= ĠVari ation Ui . getList To Submit ( list ) ĊĠĠĠĠĠĠĠ Ġsubmit List ( list To Submit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( getItem ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVari ation Ui . Header Ġ-> ĠHEADER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVari ation Ui . Item Ġ-> ĠITEM ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( view Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHEADER Ġ-> ĠViewHolder . Header ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠListItem Variation Header Binding . inflate ( in flater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠITEM Ġ-> ĠViewHolder . Item ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠListItem Variation Item Binding . inflate ( in flater , Ġparent , Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" view Type Ġis Ġnot Ġrecognized . ĠCheck Ġhow Ġyou Ġare Ġdefining ĠgetItem ViewType Ġmethod .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġholder . bind ( getItem ( position )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt , Ġpayload s : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payload s . isNotEmpty () Ġ&& Ġholder Ġis ĠViewHolder . Item ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġpayload s . last () Ġas ĠBundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind From Payload ( payload ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Bind ViewHolder ( holder , Ġposition , Ġpayload s ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsealed Ġclass ĠViewHolder ( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġbind ( item : ĠVari ation Ui ) ĊĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġget Basic Description ( packet : ĠString , Ġweight : ĠInt , Ġunit : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweight String Ġ= Ġif Ġ( weight Ġ> Ġ 0 ) Ġ"( Â ± Ġ$ weight $ unit )" Ġelse Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ packet Ġ$ weight String " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠHeader ViewHolder ( private Ġvar Ġbinding : ĠListItem Variation Header Binding ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitem : ĠVari ation Ui . Header ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( item : ĠVari ation Ui ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Ġ= Ġitem Ġas ĠVari ation Ui . Header ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . title . text Ġ= Ġget Basic Description ( it . packet , Ġit . weight , Ġit . unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclass ĠItem ViewHolder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġbinding : ĠListItem Variation Item Binding , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġlistener : ĠOn ItemClickListener ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġitem : ĠVari ation Ui . Item ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Add . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Item Click ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Id Ġ= Ġit . var Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Ġ= Ġit . detail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġ= ĠOn ItemClickListener . BUTTON _ ADD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Item Click ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Id Ġ= Ġit . var Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail Ġ= Ġit . detail , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhich Ġ= ĠOn ItemClickListener . BUTTON _ RED UCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbind ( item : ĠVari ation Ui ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Ġ= Ġitem Ġas ĠVari ation Ui . Item ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Enabled State ( it . stock ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Price ( it . price , Ġit . discount ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Description ( it . header Is Visible , Ġit . packet , Ġit . weight , Ġit . unit , Ġit . detail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Quantity State ( it . quantity , Ġit . max Order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġbind From Payload ( payload : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payload . containsKey ( Payload Constants . QU ANT ITY )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Quantity State ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquantity Ġ= Ġpayload . getInt ( Payload Constants . QU ANT ITY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Order Ġ= Ġpayload . getInt ( Payload Constants . MAX _ ORDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Enabled State ( stock : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . root . load Enabled State ( stock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Price ( price : ĠInt , Ġdiscount : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġbinding . price . context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . price . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Formatted Price ( final Price Ġ= Ġprice , Ġdiscount Ġ= Ġdiscount , Ġcontext Ġ= Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Description ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Is Visible : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpacket : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweight : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunit : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetail : ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! header Is Visible ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description . text Ġ= Ġget Basic Description ( packet , Ġweight , Ġunit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description . text Ġ= Ġdetail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġload Quantity State ( quantity : ĠInt , Ġmax Order : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Add . set Quantity State ( quantity Ġ= Ġquantity , Ġmax Order Ġ= Ġmax Order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . set Quantity State ( quantity Ġ= Ġquantity , Ġmax Order Ġ= Ġmax Order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . text Ġ= Ġquantity . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons Visibility On Quantity State ( quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbuttons Visibility On Quantity State ( quantity : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( quantity Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . btn Reduce . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . quantity . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠDiff Callback Ġ: ĠDiff Util . Item Callback < Variation Ui >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠVari ation Ui , Ġnew Item : ĠVari ation Ui ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( old Item Ġis ĠVari ation Ui . Header Ġ&& Ġnew Item Ġis ĠVari ation Ui . Header ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . packet Ġ== Ġnew Item . packet ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( old Item Ġis ĠVari ation Ui . Item Ġ&& Ġnew Item Ġis ĠVari ation Ui . Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Item . var Id Ġ== Ġnew Item . var Id Ġ&& Ġold Item . detail Ġ== Ġnew Item . detail ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠVari ation Ui , Ġnew Item : ĠVari ation Ui ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Change Payload ( old Item : ĠVari ation Ui , Ġnew Item : ĠVari ation Ui ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( old Item Ġis ĠVari ation Ui . Item Ġ&& Ġnew Item Ġis ĠVari ation Ui . Item ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Payload Constants . QU ANT ITY , Ġnew Item . quantity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( Payload Constants . MAX _ ORDER , Ġnew Item . max Order ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġobject ĠPayload Constants Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠQU ANT ITY Ġ= Ġ" quantity " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconst Ġval ĠMAX _ ORDER Ġ= Ġ" max Order " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ