/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠCl iff ord ĠLi u Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . mad ness . collision . main . updates Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroidx . core . view .* Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . List Update Callback Ċ import Ġcom . mad ness . collision . databinding . Fragment Updates Binding Ċ import Ġcom . mad ness . collision . databinding . Main Updates Header Binding Ċ import Ġcom . mad ness . collision . main . Main Fragment Ċ import Ġcom . mad ness . collision . main . Main Page ViewModel Ċ import Ġcom . mad ness . collision . main . Main ViewModel Ċ import Ġcom . mad ness . collision . unit .* Ċ import Ġcom . mad ness . collision . unit . Unit Ċ import Ġcom . mad ness . collision . unit . Unit Desc ViewModel Ċ import Ġcom . mad ness . collision . util . App Utils . as Bottom Margin Ċ import Ġcom . mad ness . collision . util . E lap sing Time Ċ import Ġcom . mad ness . collision . util . Tagged Fragment Ċ import Ġcom . mad ness . collision . util . X Ċ import Ġcom . mad ness . collision . util . alter Padding Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġkotlin . math . round ToInt Ċ Ċ internal Ġclass ĠUpdates Fragment Ġ: ĠTag ged Fragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠARG _ MODE Ġ= Ġ" mode " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMODE _ NORMAL Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMODE _ NO _ UP DAT ES Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġnew Instance ( mode : ĠInt ) Ġ: ĠUpdates Fragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Int ( ARG _ MODE , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUpdates Fragment (). apply Ġ{ Ġarguments Ġ= Ġb Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcategory : ĠString Ġ= Ġ" Main Updates " ĊĠĠĠ Ġoverride Ġval Ġid : ĠString Ġ= Ġ" Updates " ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠmContext : ĠContext ĊĠĠĠ Ġprivate Ġval Ġmain ViewModel : ĠMain ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġ// Ġused Ġfor Ġassignment Ġand Ġthread - safe Ġmodification ĊĠĠĠ Ġprivate Ġvar Ġ_ updates Providers : ĠMutable List < Pair < String , ĠUpdates Provider >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġupdates Providers : ĠList < Pair < String , ĠUpdates Provider >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ updates Providers ĊĠĠĠ Ġ// Ġused Ġfor Ġassignment Ġand Ġthread - safe Ġmodification ĊĠĠĠ Ġprivate Ġvar Ġ_ fragments : ĠMutable List < Pair < String , ĠFragment >> Ġ= Ġmutable ListOf () ĊĠĠĠ Ġprivate Ġval Ġfragments : ĠList < Pair < String , ĠFragment >> ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ fragments ĊĠĠĠ Ġprivate Ġvar Ġmode Ġ= ĠMODE _ NORMAL ĊĠĠĠ Ġprivate Ġval Ġis No Updates Mode : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmode Ġ== ĠMODE _ NO _ UP DAT ES ĊĠĠĠ Ġ// Ġlast Ġtime Ġview Ġcreated ĊĠĠĠ Ġprivate Ġval Ġel ap sing View Created Ġ= ĠE lap sing Time () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Binding : ĠFragment Updates Binding ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġinflater : ĠLayoutInflater ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġcontext Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġinflater Ġ= ĠLayoutInflater . from ( mContext ) ĊĠĠĠĠĠĠĠ Ġmode Ġ= Ġarguments ?. getInt ( ARG _ MODE ) Ġ?: ĠMODE _ NORMAL ĊĠĠĠĠĠĠĠ Ġif Ġ( is No Updates Mode ) Ġreturn ĊĠĠĠĠĠĠĠ Ġ_ updates Providers Ġ= ĠDesc Retriever ( mContext ). include Pin State (). do Filter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. retrieve Installed (). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit . get Updates ( it . unit Name )?. run Ġ{ Ġit . unit Name Ġto Ġthis Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĠsavedInstanceState : ĠBundle ?): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġview Binding Ġ= ĠFragment Updates Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġview Binding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġload Updates () ĊĠĠĠĠĠĠĠ Ġel ap sing View Created . reset () ĊĊĠĠĠĠĠĠĠ Ġval Ġextra Ġ= ĠX . size ( mContext , Ġ 5 f , ĠX . DP ). round ToInt () ĊĠĠĠĠĠĠĠ Ġmain ViewModel . content Width Top . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . main Updates Container . alter Padding ( top Ġ= Ġit Ġ+ Ġextra ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġparent Fragment ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠMain Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Page ViewModel : ĠMain Page ViewModel Ġby Ġparent . view Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Page ViewModel . bottom Content Width . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Binding . main Updates Container . alter Padding ( bottom Ġ= Ġas Bottom Margin ( it Ġ+ Ġextra )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdesc ViewModel : ĠUnit Desc ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠĠĠĠĠ Ġdesc ViewModel . updated . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Item ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġ// Ġreload Ġupdates Ġif Ġit Ġhas Ġbeen Ġover Ġ 2 Ġminutes ĊĠĠĠĠĠĠĠ Ġ// Ġsince Ġthe Ġlast Ġtime Ġupdates Ġwere Ġloaded ĊĠĠĠĠĠĠĠ Ġif Ġ( el ap sing View Created . interval ( 1 2 0 _ 0 0 0 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclear Updates () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Updates () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġreturning Ġfrom Ġother Ġbottom Ġnav Ġdestination Ġwould Ġrestore Ġadded Ġfragments ĊĠĠĠĠĠĠĠ Ġ// Ġbut Ġfragment Ġcontainers Ġneed Ġto Ġbe Ġrestored Ġmanually ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġremove Ġthe Ġadded Ġfragments Ġbefore Ġthe Ġstate Ġis Ġsaved ĊĠĠĠĠĠĠĠ Ġclear Updates () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Hidden Changed ( hidden : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfragments . forEach Ġ{ Ġ(_, Ġf ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf . on Hidden Changed ( hidden ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! hidden ) Ġupdate Updates () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Update Fragments (): ĠMutable List < Pair < String , ĠFragment >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġupdates Providers . map NotNull Ġ{ Ġ( unit Name , Ġprovider ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . has Updates ( this )) Ġprovider . fragment ?. let Ġ{ Ġunit Name Ġto Ġit Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ}. to Mutable List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemove Ġall Ġthe Ġupdates , Ġespecially Ġthe Ġfragments Ġfrom Ġfragment Ġmanager ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġclear Updates () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( fragments . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( view Binding . main Updates Update Container . isEmpty ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfragments . indices . reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Update Fragment ( fragments [ i ], Ġi ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Updates () Ġ= Ġlifecycle Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ fragments Ġ= Ġretrieve Update Fragments () ĊĠĠĠĠĠĠĠ Ġif Ġ( fragments . isEmpty ()) Ġreturn @ launch ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġlaunch When Started Ġto Ġavoid ĠIllegalArgumentException : ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġview Ġfound Ġfor Ġid Ġ 0 x 1 Ġ( unknown ) Ġfor Ġfragment ĠMy Updates Fragment ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch When Started Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Fragment ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Update Fragment ( update Fragment : ĠPair < String , ĠFragment >, Ġindex : ĠInt Ġ= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( unit Name : ĠString , Ġfragment : ĠFragment ) Ġ= Ġupdate Fragment ĊĠĠĠĠĠĠĠ Ġif Ġ( fragment . is Added ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġadd Update Fragment Container ( unit Name , Ġindex ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġchild FragmentManager . beginTransaction (). add ( container . id , Ġfragment ). commit Now Allow ing State Loss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Update Fragment Container ( unit Name : ĠString , Ġindex : ĠInt ) Ġ: ĠViewGroup ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġget Update Fragment Container ( unit Name ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġview Binding . main Updates Update Container . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 ) Ġadd View ( container ) Ġelse Ġadd View ( container , Ġindex ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontainer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Update Fragment Container ( unit Name : ĠString ) Ġ: ĠViewGroup ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescription Ġ= ĠUnit . getDescription ( unit Name ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= ĠLinearLayout ( mContext ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠView . generate View Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= ĠLinearLayout . LayoutParams ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams . MATCH _ PARENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorientation Ġ= ĠLinearLayout . VERTICAL ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠMain Updates Header Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġicon Ġ= Ġdescription . get Icon ( mContext ) ĊĠĠĠĠĠĠĠ Ġheader . main Updates Header . set Compound Draw ables Relative With Intr insic Bounds ( icon , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġheader . main Updates Header . text Ġ= Ġdescription . getName ( mContext ) ĊĠĠĠĠĠĠĠ Ġheader . main Updates Header Container . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain ViewModel . display Unit ( unit Name , Ġshould Show Nav After Back Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontainer . addView ( header . root ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontainer ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Update Fragment ( update Fragment : ĠPair < String , ĠFragment >, Ġindex : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġview Binding . main Updates Update Container . size Ġ- Ġ 1 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġ(_, Ġfragment : ĠFragment ) Ġ= Ġupdate Fragment ĊĠĠĠĠĠĠĠ Ġchild FragmentManager . beginTransaction (). remove ( fragment ). commit Now Allow ing State Loss () ĊĠĠĠĠĠĠĠ Ġview Binding . main Updates Update Container . remove View At ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Updates () Ġ= Ġlifecycle Scope . launch ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Fragments Ġ= Ġretrieve Update Fragments () ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= ĠDiff Util . calculate Diff ( object Ġ: ĠDiff Util . Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Old List Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragments . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget New List Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Fragments . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragments [ old Item Position ]. first Ġ== Ġnew Fragments [ new Item Position ]. first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfragments [ old Item Position ]. first Ġ== Ġnew Fragments [ new Item Position ]. first ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdiff . dispatch Updates To ( object Ġ: ĠList Update Callback Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Inserted ( position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġposition Ġuntil Ġposition Ġ+ Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Fragment ( new Fragments [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Removed ( position : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ( position Ġuntil Ġposition Ġ+ Ġcount ). reversed ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Update Fragment ( fragments [ i ], Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Moved ( from Position : ĠInt , Ġto Position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( position : ĠInt , Ġcount : ĠInt , Ġpayload : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ fragments Ġ= Ġnew Fragments ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠList Ġchanges Ġinclude Ġaddition Ġand Ġdeletion Ġbut Ġno Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Item ( state ful : ĠStateful Description ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Addition Ġ= Ġstate ful . is Pin ned ĊĠĠĠĠĠĠĠ Ġif Ġ( is Addition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( updates Providers . any Ġ{ Ġit . first Ġ== Ġstate ful . unit Name Ġ}) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠUnit . get Updates ( state ful . unit Name ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized (_ updates Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ updates Providers . add ( state ful . unit Name Ġto Ġprovider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! provider . has Updates ( this )) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġprovider . fragment Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Fragment Ġ= Ġstate ful . unit Name Ġto Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized (_ fragments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ fragments . add ( update Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Fragment ( update Fragment ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġupdates Providers . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġupdates Providers [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . first Ġ!= Ġstate ful . unit Name ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized (_ updates Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ updates Providers . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġfragments . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġfragments [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment . first Ġ!= Ġstate ful . unit Name ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized (_ fragments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ fragments . remove At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Update Fragment ( fragment , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ