package Ġcom . d inar ap aran id . pri ma . utils . pol ym orphism Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . databinding . ViewData Binding Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . bump tech . glide . G lide Ċ import Ġcom . d inar ap aran id . pri ma . MainActivity Ċ import Ġcom . d inar ap aran id . pri ma . utils . Params Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . Serializable Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . locks . Condition Ċ import Ġjava . util . concurrent . locks . Lock Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ġ[ Updating List Fragment ] Ġfor ĠMainActivity 's Ġlist Ġfragment Ġwith Ġ[ update UI ] Ġ*/ Ċ Ċ abstract Ġclass ĠMainActivity Updating List Fragment < T , ĠA , ĠV H , ĠB > Ġ: ĊĠĠĠ ĠUpdating List Fragment < MainActivity , ĠT , ĠA , ĠV H , ĠB >(), ĊĠĠĠ ĠMainActivity Fragment , ĊĠĠĠ ĠR ising ĊĠĠĠĠĠĠĠ Ġwhere ĠT Ġ: ĠSerializable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV H Ġ: ĠRecyclerView . ViewHolder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA Ġ: ĠAsync List Differ Adapter < T , ĠV H >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB Ġ: ĠView Data Binding Ġ{ ĊĠĠĠ Ġfinal Ġoverride Ġvar Ġis Main Label Initialized Ġ= Ġfalse ĊĠĠĠ Ġfinal Ġoverride Ġval Ġawait Main Label Init Lock : ĠLock Ġ= ĠRe entrant Lock () ĊĠĠĠ Ġfinal Ġoverride Ġval Ġawait Main Label Init Condition : ĠCondition Ġ= Ġawait Main Label Init Lock . new Condition () ĊĊĠĠĠ Ġfinal Ġoverride Ġlateinit Ġvar Ġmain Label Old Text : ĠString ĊĠĠĠ Ġfinal Ġoverride Ġlateinit Ġvar Ġmain Label Cur Text : ĠString ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġset MainActivity Main Label () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Activity . main Label Cur Text Ġ= Ġmain Label Old Text ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġfragment Activity . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Worker Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Main Label Init Lock . with Lock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! is Main Label Initialized ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġawait Main Label Init Condition . await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Label Cur Text Ġ= Ġthis @ MainActivity Updating List Fragment . main Label Cur Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Fragment Ġ= ĠWeak Reference ( this @ MainActivity Updating List Fragment ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġis Main Label Initialized Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠG lide . get ( require Context ()). clear Memory () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġup () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun On UIT hread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! fragment Activity . is U pped ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( re cyclerView Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView !!. layout Params Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( re cyclerView !!. layout Params Ġas ĠConstraint Layout . LayoutParams ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Margin Ġ= ĠParams . PLAY ING _ TOOL BAR _ HEIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġset Main Label Initialized () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Main Label Initialized Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġawait Main Label Init Lock . with Lock ( await Main Label Init Condition :: signal ) ĊĠĠĠ Ġ} Ċ }