package Ġcom . mer x ury . block er . ui . detail . component Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . ListAdapter Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . el vis he w . x log . X Log Ċ import Ġcom . mer x ury . block er . databinding . Component Item Binding Ċ Ċ class ĠComponent Adapter Ġ: ĊĠĠĠ ĠList Adapter < Component Data , ĠComponent Adapter . Component ViewHolder >( Diff Callback ()) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠX Log . tag (" Component Adapter ") ĊĠĠĠ Ġvar Ġon Switch Click : Ġ(( Component Data , ĠBoolean ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠComponent ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġparent . context ĊĠĠĠĠĠĠĠ Ġval Ġbinding Ġ= ĠComponent Item Binding . inflate ( LayoutInflater . from ( context ), Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠComponent ViewHolder ( context , Ġbinding ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠComponent ViewHolder , Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomponent Ġ= Ġcurrent List . get OrNull ( position ) ĊĠĠĠĠĠĠĠ Ġif Ġ( component Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Component Ġinfo Ġis Ġnull , Ġposition : Ġ$ position ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġholder . bind ( component ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Item ( component : ĠComponent Data ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcomponent . name ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġcurrent List . indexOf First Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Can 't Ġfind Ġupdated Ġitem Ġin Ġthe Ġlist , Ġname : Ġ$ name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠDiff Callback Ġ: ĠDiff Util . Item Callback < Component Data >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item : ĠComponent Data , Ġnew Item : ĠComponent Data ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item . name Ġ== Ġnew Item . name ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠComponent Data , Ġnew Item : ĠComponent Data ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠComponent ViewHolder ( val Ġcontext : ĠContext , Ġval Ġbinding : ĠComponent Item Binding ) Ġ: ĊĠĠĠĠĠĠĠ ĠRecyclerView . ViewHolder ( binding . root ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( component : ĠComponent Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . component Name . text Ġ= Ġcomponent . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . component PackageName . text Ġ= Ġcomponent . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Blocked Ġ= Ġcomponent . if w Blocked Ġ|| Ġcomponent . pm Blocked ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . component Switch . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Checked ChangeListener ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Checked Ġ= Ġ! is Blocked ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset On Checked ChangeListener Ġ{ Ġ_, Ġis Checked Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Switch Click ?. invoke ( component , Ġis Checked ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . running Indicator . isVisible Ġ= Ġcomponent . isRunning ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }