package Ġcom . k ier on qu inn . app . t apt ap . ui . screens . settings . action Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . lifecycle . Lifecycle Owner Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . k ier on qu inn . app . t apt ap . R Ċ import Ġcom . k ier on qu inn . app . t apt ap . databinding . Item Action Binding Ċ import Ġcom . k ier on qu inn . app . t apt ap . databinding . Item Action Header Binding Ċ import Ġcom . k ier on qu inn . app . t apt ap . databinding . Item Action Header Triple Binding Ċ import Ġcom . k ier on qu inn . app . t apt ap . models . Action Internal Ċ import Ġcom . k ier on qu inn . app . t apt ap . utils . extensions . observe Ċ import Ġcom . k ier on qu inn . app . t apt ap . components . drag recycler . RecyclerView Item Move Callback Ċ import Ġjava . util .* Ċ Ċ class ĠSettings Action Adapter ( lifecycle Owner : ĠLifecycle Owner , Ġprivate Ġval ĠviewModel : ĠSettings Action ViewModel , Ġprivate Ġval Ġcontext : ĠContext , Ġvar Ġitems : ĠMutable List < Action Internal >, Ġprivate Ġval Ġis Triple : ĠBoolean , Ġprivate Ġval Ġheader ClickListener : Ġ() Ġ-> ĠUnit ): ĠRecyclerView . Adapter < Settings Action Adapter . ViewHolder >(), ĠRecyclerView Item Move Callback . RecyclerView Item Move Listener Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠviewModel . selected State . observe ( lifecycle Owner ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . previous SelectedIndex Ġ!= Ġ- 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( it . previous SelectedIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it Ġis ĠSettings Action ViewModel . Selected State . Action Selected ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( it . selected Item Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . triple Tap Enabled . observe ( lifecycle Owner ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( is Triple ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . blocking Warning . observe ( lifecycle Owner ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . position Ġ!= Ġ- 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( it . position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( it . previous Position Ġ!= Ġ- 1 ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( it . previous Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠviewModel . state . observe ( lifecycle Owner ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . update Info Position () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġchip Add ClickListener : Ġ(( Int ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġlayout Inflater Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . LAYOUT _ IN FL ATER _ SERVICE ) Ġas ĠLayoutInflater ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġitems . size Ġ+ Ġ 1 ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ> Ġ 0 Ġ-> Ġreturn ĠItem Type . ITEM . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Triple Ġ-> ĠItem Type . HEADER _ TR IP LE . ordinal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠItem Type . HEADER _ DOUBLE . ordinal ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( ItemType . values ()[ view Type ]){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Type . HEADER _ DOUBLE Ġ-> ĠViewHolder . Settings Action Header Double ( Item Action Header Binding . inflate ( layout Inflater , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Type . HEADER _ TR IP LE Ġ-> ĠViewHolder . Settings Action Header Triple ( Item Action Header Triple Binding . inflate ( layout Inflater , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠItem Type . ITEM Ġ-> ĠViewHolder . Settings Action Item ( Item Action Binding . inflate ( layout Inflater , Ġparent , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder , Ġposition : ĠInt ) Ġ= Ġwhen ( holder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠViewHolder . Settings Action Header Double Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item Action Header Binding . root . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader ClickListener . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠViewHolder . Settings Action Header Triple Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item Action Header Binding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . is Focus able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( viewModel . triple Tap Enabled . value Ġ== Ġtrue ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Action Triple Title . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . set Card BackgroundColor ( Context Compat . getColor ( root . context , ĠR . color . icon _ circle _ 1 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Action Triple Title . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . set Card BackgroundColor ( Context Compat . getColor ( root . context , ĠR . color . accessibility _ cross _ circle )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠViewHolder . Settings Action Item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . setup Item () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠViewHolder . Settings Action Item . setup Item (){ ĊĠĠĠĠĠĠĠ Ġ// Take Ġinto Ġaccount Ġthe Ġheader ĊĠĠĠĠĠĠĠ Ġval Ġadjusted Position Ġ= Ġadapter Position Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġitems [ adjusted Position ] ĊĠĠĠĠĠĠĠ Ġwith ( item Action Binding ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( adapter Position Ġ== ĠviewModel . getSelected Index ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Card BackgroundColor ( Context Compat . getColor ( context , ĠR . color . card _ selected )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Card BackgroundColor ( Context Compat . getColor ( context , ĠR . color . card _ background )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Icon . setImage Resource ( item . action . icon Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Description . text Ġ= Ġitem . get Card Description ( root . context ) Ġ?: Ġroot . context . getText ( item . action . description Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Name . text Ġ= Ġroot . context . getString ( item . action . name Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action When . text Ġ= Ġitem . get Card When List Header ( root . context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Chips . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context , ĠLinearLayoutManager . HORIZONTAL , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠSettings Action Chip Adapter ( context , ĠviewModel , Ġitem . when List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Add ClickListener ?. invoke ( adapter Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Handle . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( event . action Ġ== ĠMotion Event . ACTION _ DOWN ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . on RecyclerView Drag Start ( this @ setup Item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblocked Position Ġ= ĠviewModel . blocking Warning . value ?. position Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem Action Blocked Info . root . isVisible Ġ= Ġadapter Position Ġ== Ġblocked Position Ġ&& Ġadapter Position Ġ!= Ġitems . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . setOn Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setSelected Index ( adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Row Selected ( view Holder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewHolder . item View . alpha Ġ= Ġ 0 . 5 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Row Clear ( view Holder : ĠRecyclerView . ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠviewHolder . item View . alpha Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ ĠviewModel . commit Changes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Row Moved ( from : ĠInt , Ġto : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Take Ġinto Ġaccount Ġthe Ġheader Ġwhen Ġsw apping Ġin Ġthe Ġlist ... ĊĠĠĠĠĠĠĠ Ġval Ġfrom Position Ġ= Ġfrom Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġto Position Ġ= Ġto Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġif ( from Position Ġ< Ġ 0 Ġ|| Ġto Position Ġ< Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( from Position Ġ< Ġto Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Position Ġuntil Ġto Position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . swap ( items , Ġi , Ġi Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfrom Position Ġdown To Ġto Position Ġ+ Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCollections . swap ( items , Ġi , Ġi Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ... but Ġuse Ġthe Ġadapter Ġfrom Ġand Ġto Ġwhen Ġsw apping Ġphysical Ġlocations ĊĠĠĠĠĠĠĠ Ġnotify Item Moved ( from , Ġto ) ĊĠĠĠĠĠĠĠ ĠviewModel . swap Selected ( from , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsealed Ġclass ĠViewHolder ( item View : ĠView ): ĠRecyclerView . ViewHolder ( item View ){ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSettings Action Item ( val Ġitem Action Binding : ĠItem Action Binding ): ĠViewHolder ( item Action Binding . root ) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSettings Action Header Double ( val Ġitem Action Header Binding : ĠItem Action Header Binding ): ĠViewHolder ( item Action Header Binding . root ) ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠSettings Action Header Triple ( val Ġitem Action Header Binding : ĠItem Action Header Triple Binding ): ĠViewHolder ( item Action Header Binding . root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠItem Type Ġ{ ĊĠĠĠĠĠĠĠ ĠITEM , ĠHEADER _ DOUBLE , ĠHEADER _ TR IP LE ĊĠĠĠ Ġ} Ċ }