@ file : Suppress (" NOTH ING _ TO _ INLINE ") Ċ Ċ package Ġco il . memory Ċ Ċ import Ġandroid . content . Component Callbacks 2 Ċ import Ġandroid . content . Component Callbacks 2 . TRIM _ MEMORY _ RUNNING _ LOW Ċ import Ġandroid . content . Component Callbacks 2 . TRIM _ MEMORY _ UI _ HIDDEN Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . os . Build . VERSION . SDK _ INT Ċ import Ġandroidx . annotation . Visible ForTesting Ċ import Ġco il . memory . Memory Cache . Key Ċ import Ġco il . memory . Memory Cache . Value Ċ import Ġco il . util . first NotNull Indices Ċ import Ġco il . util . identity HashCode Ċ import Ġco il . util . remove If Indices Ċ import Ġjava . lang . ref . Weak Reference Ċ Ċ /** Ċ Ġ* ĠAn Ġin - memory Ġcache Ġthat Ġholds Ġweak Ġreferences Ġto Ġ[ Bitmap ] s . Ċ Ġ* Ċ Ġ* ĠThis Ġis Ġused Ġas Ġa Ġsecondary Ġcaching Ġlayer Ġfor Ġ[ Memory Cache ]. Ġ[ Memory Cache ] Ġholds Ġstrong Ġreferences Ġto Ġits Ġbit maps . Ċ Ġ* ĠBit maps Ġare Ġadded Ġto Ġthis Ġcache Ġwhen Ġthey 're Ġremoved Ġfrom Ġ[ Memory Cache ]. Ċ Ġ* Ċ Ġ* ĠNOTE : ĠThis Ġclass Ġis Ġnot Ġthread Ġsafe . ĠIn Ġpractice , Ġit Ġwill Ġonly Ġbe Ġcalled Ġfrom Ġthe Ġmain Ġthread . Ċ Ġ*/ Ċ internal Ġinterface ĠWeak Memory Cache Ġ{ ĊĊĠĠĠ Ġ/** ĠGet Ġthe Ġvalue Ġassociated Ġwith Ġ[ key ]. Ġ*/ ĊĠĠĠ Ġfun Ġget ( key : ĠKey ): ĠValue ? ĊĊĠĠĠ Ġ/** ĠSet Ġthe Ġvalue Ġassociated Ġwith Ġ[ key ]. Ġ*/ ĊĠĠĠ Ġfun Ġset ( key : ĠKey , Ġbitmap : ĠBitmap , Ġis Sample d : ĠBoolean , Ġsize : ĠInt ) ĊĊĠĠĠ Ġ/** ĠRemove Ġthe Ġvalue Ġreferenced Ġby Ġ[ key ] Ġfrom Ġthis Ġcache Ġif Ġit Ġis Ġpresent . Ġ*/ ĊĠĠĠ Ġfun Ġinvalidate ( key : ĠKey ) ĊĊĠĠĠ Ġ/** ĠRemove Ġ[ bitmap ] Ġfrom Ġthis Ġcache Ġif Ġit Ġis Ġpresent . Ġ*/ ĊĠĠĠ Ġfun Ġinvalidate ( bitmap : ĠBitmap ) ĊĊĠĠĠ Ġ/** ĠRemove Ġall Ġvalues Ġfrom Ġthis Ġcache . Ġ*/ ĊĠĠĠ Ġfun Ġclear Memory () ĊĊĠĠĠ Ġ/** Ġ@ see ĠComponent Callbacks 2 . on Trim Memory Ġ*/ ĊĠĠĠ Ġfun Ġtrim Memory ( level : ĠInt ) Ċ } Ċ Ċ /** ĠA Ġ[ Weak Memory Cache ] Ġimplementation Ġthat Ġholds Ġno Ġreferences . Ġ*/ Ċ internal Ġobject ĠEmpty Weak Memory Cache Ġ: ĠWeak Memory Cache Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠKey ): ĠValue ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġset ( key : ĠKey , Ġbitmap : ĠBitmap , Ġis Sample d : ĠBoolean , Ġsize : ĠInt ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate ( key : ĠKey ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate ( bitmap : ĠBitmap ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġclear Memory () Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġtrim Memory ( level : ĠInt ) Ġ{} Ċ } Ċ Ċ /** ĠA Ġ[ Weak Memory Cache ] Ġimplementation Ġbacked Ġby Ġa Ġ[ HashMap ]. Ġ*/ Ċ internal Ġclass ĠReal Weak Memory Cache Ġ: ĠWeak Memory Cache Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠC LEAN _ UP _ INTERVAL Ġ= Ġ 1 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġval Ġcache Ġ= ĠHashMap < Key , ĠArrayList < Weak Value >>() ĊĊĠĠĠ Ġ@ Visible ForTesting Ġinternal Ġvar Ġoperations Since Clean Up Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġget ( key : ĠKey ): ĠValue ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġcache [ key ] Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġfirst Ġbitmap Ġthat Ġhasn 't Ġbeen Ġcollected . ĊĠĠĠĠĠĠĠ Ġval Ġstrong Value Ġ= Ġvalues . first NotNull Indices Ġ{ Ġvalue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . reference . get ()?. let Ġ{ Ġbitmap Ġ-> ĠStr ong Value ( bitmap , Ġvalue . is Sample d ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclean Up If Ne cessary () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġstrong Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset ( key : ĠKey , Ġbitmap : ĠBitmap , Ġis Sample d : ĠBoolean , Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġraw Values Ġ= Ġcache [ key ] ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġraw Values Ġ?: Ġarray ListOf () ĊĊĠĠĠĠĠĠĠ Ġ// ĠInsert Ġthe Ġvalue Ġinto Ġthe Ġlist Ġsorted Ġdescending Ġby Ġsize . ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠWeak Value ( bitmap . identity HashCode , ĠWeak Reference ( bitmap ), Ġis Sample d , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġvalues . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ>= Ġvalues [ index ]. size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . add ( index , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Ġ+= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġput Ġthe Ġlist Ġif Ġit 's Ġnot Ġalready Ġin Ġthe Ġmap . ĊĠĠĠĠĠĠĠ Ġif Ġ( raw Values Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ key ] Ġ= Ġvalues ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclean Up If Ne cessary () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate ( key : ĠKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġget ( key ) ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate ( value . bitmap ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvalidate ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentity HashCode Ġ= Ġbitmap . identity HashCode ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġthe Ġbitmap Ġin Ġthe Ġcache Ġand Ġremove Ġit . ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . values . forEach Ġ{ Ġvalues Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġvalues . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( values [ index ]. identity HashCode Ġ== Ġidentity HashCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . remove At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ run ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclean Up If Ne cessary () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemove Ġall Ġvalues Ġfrom Ġthis Ġcache . Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġclear Memory () Ġ{ ĊĠĠĠĠĠĠĠ Ġcache . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** Ġ@ see ĠComponent Callbacks 2 . on Trim Memory Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġtrim Memory ( level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( level Ġ>= ĠTR IM _ MEMORY _ RUNNING _ LOW Ġ&& Ġlevel Ġ!= ĠTR IM _ MEMORY _ UI _ HIDDEN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Up If Ne cessary () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( operations Since Clean Up ++ Ġ>= ĠC LEAN _ UP _ INTERVAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclean Up () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠRemove Ġany Ġdere fer enced Ġbit maps Ġfrom Ġthe Ġcache . Ġ*/ ĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġfun Ġclean Up () Ġ{ ĊĠĠĠĠĠĠĠ Ġoperations Since Clean Up Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġall Ġthe Ġvalues Ġwhose Ġreferences Ġhave Ġbeen Ġcollected . ĊĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġcache . values . iterator () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġiterator . next () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . count () Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTypically , Ġthe Ġlist Ġwill Ġonly Ġcontain Ġ 1 Ġitem . ĠHandle Ġthis Ġcase Ġin Ġan Ġoptimal Ġway Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . first OrNull ()?. reference ?. get () Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIterate Ġover Ġthe Ġlist Ġof Ġvalues Ġand Ġdelete Ġindividual Ġentries Ġthat Ġhave Ġbeen Ġcollected . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SDK _ INT Ġ>= Ġ 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . remove If Ġ{ Ġit . reference . get () Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . remove If Indices Ġ{ Ġit . reference . get () Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġiterator . remove () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Visible ForTesting ĊĠĠĠ Ġinternal Ġclass ĠWeak Value ( ĊĠĠĠĠĠĠĠ Ġval Ġidentity HashCode : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġreference : ĠWeak Reference < Bitmap >, ĊĠĠĠĠĠĠĠ Ġval Ġis Sample d : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġclass ĠStr ong Value ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġbitmap : ĠBitmap , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Sample d : ĠBoolean ĊĠĠĠ Ġ) Ġ: ĠValue Ċ } Ċ