package Ġcom . ban uba . sdk . example . be aut ification . camera Ċ Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . ban uba . sdk . example . be aut ification . databinding . Feature Binding Ċ Ċ class ĠFeatures Adapter ( private Ġval Ġclick Listener : ĠFeature Listener ) Ġ: ĠList Adapter < Feature Item , ĠRecyclerView . ViewHolder >( ĊĠĠĠ ĠFeatures Diff Callback () Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdefault Position Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġactive Position Ġ= Ġdefault Position ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠRecyclerView . ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠText ViewHolder . from ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠRecyclerView . ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠText ViewHolder Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfeature Item Ġ= ĠgetItem ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder . bind ( feature Item . feature , Ġactive Position Ġ== Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Listener Wrapper Ġ{ Ġfeature : ĠFeature Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Position Ġ= Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclick Listener . onClick ( feature ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify DataSet Changed () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsubmit List ( list : ĠMutable List < Feature Item > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . submit List ( list ) ĊĊĠĠĠĠĠĠĠ Ġactive Position Ġ= Ġdefault Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠText ViewHolder ( private Ġval Ġbinding : ĠFeature Binding ): ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom ( parent : ĠViewGroup ): ĠText ViewHolder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Inflater Ġ= ĠLayoutInflater . from ( parent . context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠFeature Binding . inflate ( layout Inflater , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠText ViewHolder ( binding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠFeature , Ġselected : ĠBoolean , Ġlistener : ĠFeature Listener Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . feature Ġ= Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . click Listener Ġ= Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . selected Ġ= Ġselected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . execute Pending Bindings () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFeatures Diff Callback Ġ: ĠDiff Util . Item Callback < Feature Item >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠFeature Item , Ġnew Item : ĠFeature Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item . name Ġ== Ġnew Item . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠFeature Item , Ġnew Item : ĠFeature Item ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠFeature Listener ( private Ġval Ġclick Listener : Ġ( name : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfun ĠonClick ( feature : ĠFeature ) Ġ= Ġclick Listener ( feature . name ) Ċ } Ċ Ċ class ĠFeature Listener Wrapper ( private Ġval Ġlistener : Ġ( feature : ĠFeature ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġfun ĠonClick ( feature : ĠFeature ) Ġ= Ġlistener ( feature ) Ċ } Ċ Ċ data Ġclass ĠFeature Item ( val Ġfeature : ĠFeature ) Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġfeature . name Ċ } Ċ