package Ġfr . sm ar quis . app store Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . collection . Array Map Ċ import Ġandroidx . recyclerview . widget . Sort edList Ċ import Ġandroidx . recyclerview . widget . Sort edList Adapter Callback Ċ import Ġcom . firebase . ui . common . Change EventType Ċ import Ġcom . firebase . ui . database . Firebase Recycler Adapter Ċ import Ġcom . firebase . ui . database . Firebase Recycler Options Ċ import Ġcom . google . firebase . database . Data Snapshot Ċ import Ġcom . google . firebase . database . Database Error Ċ import Ġcom . google . firebase . database . Database Reference Ċ Ċ class ĠVersion Adapter ( ĊĠĠĠĠĠĠĠ Ġquery : ĠDatabase Reference , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcallback : ĠCallback Ċ ) Ġ: ĠFirebase Recycler Adapter < Version , ĠVersion ViewHolder >( recycler Options ( query )) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġre cycler Options ( query : ĠDatabase Reference ) Ġ= ĠFirebase Recycler Options . Builder < Version >(). set Query ( query ) Ġ{ ĠVersion . parse ( it ) !! Ġ}. build () ĊĊĠĠĠĠĠĠĠ Ġval ĠP AY LOAD _ PROGRESS _ CHANGED Ġ= ĠAny () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠCallback Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġshow Empty State () ĊĠĠĠĠĠĠĠ Ġfun Ġon Item Clicked ( version : ĠVersion , Ġversion ViewHolder : ĠVersion ViewHolder ) ĊĠĠĠĠĠĠĠ Ġfun Ġon Item Long Clicked ( version : ĠVersion , Ġversion ViewHolder : ĠVersion ViewHolder ): ĠBoolean ĊĠĠĠĠĠĠĠ Ġfun Ġon Item Changed ( version : ĠVersion ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstable Ids Ġ= ĠHashMap < String , ĠLong >() ĊĊĠĠĠ Ġprivate Ġval Ġsorted List Callback Ġ= Ġobject Ġ: ĠSort edList Adapter Callback < Version >( this ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( item 1 : ĠVersion ?, Ġitem 2 : ĠVersion ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitem 1 ?. key . equals ( item 2 ?. key ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item : ĠVersion ?, Ġnew Item : ĠVersion ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġold Item Ġ== Ġnew Item ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( o 1 : ĠVersion ?, Ġo 2 : ĠVersion ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo 1 Ġ== Ġnull Ġ|| Ġo 2 Ġ== Ġnull Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġo 1 . compareTo ( o 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsorted List Ġ= ĠSort edList ( Version :: class . java , Ġsorted List Callback ) ĊĊĠĠĠ Ġprivate Ġval Ġl ut Ġ= ĠArray Map < String , ĠVersion >( 1 0 ) ĊĊĠĠĠ Ġprivate Ġvar Ġhighlight Version Key : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġhighlight Version ( key : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . highlight Version Key Ġ= Ġkey ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Child Changed ( type : ĠChange EventType , Ġsnapshot : ĠData Snapshot , Ġnew Index : ĠInt , Ġold Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= ĠVersion . parse ( snapshot ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChange EventType . AD DED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl ut [ version . key ] Ġ= Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted List . add ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChange EventType . RE MOVED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl ut [ version . key ] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted List . remove ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChange EventType . CHANGED , ĠChange EventType . MOVED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl ut [ version . key ]?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted List . update Item At ( sort edList . indexOf ( it ), Ġversion ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl ut [ version . key ] Ġ= Ġversion ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Ġ== ĠChange EventType . CHANGED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Item Changed ( version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Data Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Data Changed () ĊĠĠĠĠĠĠĠ Ġif Ġ( item Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . show Empty State () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ): ĠVersion Ġ= Ġsorted List . get ( position ) ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġsorted List . size () ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ= ĠR . layout . item _ version ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Id ( position : ĠInt ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstable Ids . get Or Put ( getItem ( position ). key . or Empty ()) Ġ{ Ġstable Ids . size . to Long () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ): ĠVersion ViewHolder Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠLayoutInflater . from ( parent . context ). inflate ( R . layout . item _ version , Ġparent , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn ĠVersion ViewHolder ( view , Ġcallback ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠVersion ViewHolder , Ġposition : ĠInt , Ġversion : ĠVersion ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDEBUG _ SCREEN SHOT _ STATUS ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion . status Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion . progress Ġ= Ġit . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġholder . bind ( version ) ĊĠĠĠĠĠĠĠ Ġif Ġ( version . key Ġ== Ġhighlight Version Key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighlight Version Key Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . highlight ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠVersion ViewHolder , Ġposition : ĠInt , Ġpayload s : ĠMutable List < Any >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( payload s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Bind ViewHolder ( holder , Ġposition ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( payload Ġin Ġpayload s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( payload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP AY LOAD _ PROGRESS _ CHANGED Ġ-> Ġholder . render Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Re cyc led ( holder : ĠVersion ViewHolder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Re cyc led ( holder ) ĊĠĠĠĠĠĠĠ Ġholder . unbind () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( error : ĠDatabase Error ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . w (" Version Adapter ", Ġ" message :${ error . message }, Ġcode :${ error . code }") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġupdate Version Progress ( version : ĠVersion ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Ġ= Ġsorted List . indexOf ( version ) ĊĠĠĠĠĠĠĠ Ġif Ġ( indexOf Ġ!= ĠSort edList . INVALID _ POSITION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsorted List . get ( indexOf ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġversion . status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġversion . progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFake Ġpayload Ġto Ġavoid Ġgl itch Ġwhen Ġscrolling ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Item Changed ( indexOf , ĠP AY LOAD _ PROGRESS _ CHANGED ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" Version Adapter ", Ġ" Version Ġnot Ġfound Ġin Ġthe Ġlist !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNote : ĠWe Ġcould Ġretry Ġand Ġsearch Ġthe Ġwhole Ġlist Ġfor Ġthe Ġsame Ġversion Ġkey ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }