package Ġleak can ary . internal . activity . screen Ċ Ċ import Ġandroid . text . Html Ċ import Ġandroid . text . Sp ann able StringBuilder Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Adapter View Ċ import Ġandroid . widget . Adapter View . On ItemSelected Listener Ċ import Ġandroid . widget . ListView Ċ import Ġandroid . widget . Spinner Ċ import Ġandroid . widget . TextView Ċ import Ġcom . squareup . leak can ary . core . R Ċ import Ġleak can ary . internal . Display Leak Adapter Ċ import Ġleak can ary . internal . S qu ig gly Span Ċ import Ġleak can ary . internal . activity . db . Leak Table Ċ import Ġleak can ary . internal . activity . db . Leak Table . Leak Details Ċ import Ġleak can ary . internal . activity . db . Leak Table . Leak Projection Ċ import Ġleak can ary . internal . activity . db . execute On Db Ċ import Ġleak can ary . internal . activity . share Ċ import Ġleak can ary . internal . activity . share Heap Dump Ċ import Ġleak can ary . internal . activity . share To Stack Overflow Ċ import Ġleak can ary . internal . activity . ui . Simple ListAdapter Ċ import Ġleak can ary . internal . activity . ui . Ui Utils . replace Url Span With Action Ċ import Ġleak can ary . internal . navigation . Screen Ċ import Ġleak can ary . internal . navigation . activity Ċ import Ġleak can ary . internal . navigation . goTo Ċ import Ġleak can ary . internal . navigation . inflate Ċ import Ġsh ark . Heap Analysis Success Ċ import Ġsh ark . Leak Ċ import Ġsh ark . Library Leak Ċ Ċ internal Ġclass ĠLe ak Screen ( ĊĠ Ġprivate Ġval Ġgroup Hash : ĠString , ĊĠ Ġprivate Ġval Ġselected Heap Analysis Id : ĠLong ? Ġ= Ġnull Ċ ) Ġ: ĠScreen () Ġ{ ĊĠ Ġoverride Ġfun Ġcreate View ( container : ĠViewGroup ) Ġ= ĊĠĠĠ Ġcontainer . inflate ( R . layout . leak _ can ary _ leak _ screen ). apply Ġ{ ĊĠĠĠĠĠ Ġactivity . title Ġ= Ġresources . getString ( R . string . leak _ can ary _ loading _ title ) ĊĠĠĠĠĠ Ġexecute On Db Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġle aks Ġ= ĠLe ak Table . retrieve Leak sBy Hash ( db , Ġgroup Hash ) ĊĠĠĠĠĠĠĠ Ġupdate Ui Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( le aks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . title Ġ= Ġresources . getString ( R . string . leak _ can ary _ leak _ not _ found ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Le aks Retrie ved ( le aks , Ġselected Heap Analysis Id ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠView . on Le aks Retrie ved ( ĊĠĠĠ Ġle aks : ĠList < Leak Projection >, ĊĠĠĠ Ġselected Heap Analysis Id : ĠLong ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġactivity . title Ġ= ĠString . format ( ĊĠĠĠĠĠĠĠ Ġresources . get Quantity Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . plurals . leak _ can ary _ group _ screen _ title , Ġle aks . size ĊĠĠĠĠĠĠĠ Ġ). toString (), Ġle aks . size , Ġle aks [ 0 ]. group Description ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġspinner Ġ= ĠfindViewById < Spinner >( R . id . leak _ can ary _ spinner ) ĊĊĠĠĠ Ġval Ġselected Leak Index Ġ= ĊĠĠĠĠĠ Ġif Ġ( selected Heap Analysis Id Ġ== Ġnull ) Ġ- 1 Ġelse Ġle aks . indexOf First Ġ{ Ġit . analysis Id Ġ== Ġselected Heap Analysis Id Ġ} ĊĠĠĠ Ġif Ġ( selected Leak Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠ Ġspinner . setSelection ( selected Leak Index ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġspinner . setSelection ( 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġspinner . adapter Ġ= ĠSimple ListAdapter ( R . layout . leak _ can ary _ simple _ row , Ġle aks ) Ġ{ Ġview , Ġposition Ġ-> ĊĠĠĠĠĠ Ġval Ġtitle View Ġ= Ġview . findViewById < TextView >( R . id . leak _ can ary _ row _ text ) ĊĠĠĠĠĠ Ġval Ġtime View Ġ= Ġview . findViewById < TextView >( R . id . leak _ can ary _ row _ small _ text ) ĊĠĠĠĠĠ Ġtitle View . text Ġ= ĊĠĠĠĠĠĠĠ Ġview . resources . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . leak _ can ary _ class _ has _ le aked , Ġle aks [ position ]. class Simple Name ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġtime View . text Ġ= ĠDate Utils . format DateTime ( ĊĠĠĠĠĠĠĠĠĠ Ġview . context , Ġle aks [ position ]. createdAt Time Millis , ĊĠĠĠĠĠĠĠĠĠ ĠDate Utils . FORMAT _ SHOW _ TIME Ġor ĠDate Utils . FORMAT _ SHOW _ DATE ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġspinner . on ItemSelected Listener Ġ= Ġobject Ġ: ĠOn ItemSelected Listener Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġon Nothing Selected ( parent : ĠAdapter View < *> ?) Ġ{ ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon ItemSelected ( ĊĠĠĠĠĠĠĠ Ġparent : ĠAdapter View < *> ?, ĊĠĠĠĠĠĠĠ Ġview : ĠView ?, ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġid : ĠLong ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute On Db Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLe ak Table . retrieve Leak ById ( db , Ġle aks [ position ]. id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġleak Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Ui Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Leak Trace ( leak ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠView . display Leak Trace ( projection : ĠLe ak Details ) Ġ{ ĊĠĠĠ Ġval Ġleak Ġ= Ġprojection . leak ĊĠĠĠ Ġval Ġanalysis Ġ= Ġprojection . analysis ĊĊĠĠĠ Ġval ĠlistView Ġ= ĠfindViewById < ListView >( R . id . leak _ can ary _ list ) ĊĠĠĠ ĠlistView . alpha Ġ= Ġ 0 f ĊĠĠĠ ĠlistView . animate () ĊĠĠĠĠĠĠĠ Ġ. alpha ( 1 f ) ĊĊĠĠĠ Ġval Ġtitle Text Ġ= Ġ""" ĊĠĠĠĠĠ ĠOpen Ġ< a Ġhref =" open _ analysis "> Heap ĠDump </ a >< br >< br > ĊĠĠĠĠĠ ĠShare Ġleak Ġtrace Ġ< a Ġhref =" share "> as Ġtext </ a > Ġor Ġon Ġ< a Ġhref =" share _ stack _ overflow "> Stack ĠOverflow </ a >< br >< br > ĊĠĠĠĠĠ ĠShare Ġ< a Ġhref =" share _ h prof "> Heap ĠDump Ġfile </ a >< br >< br > ĊĠĠĠĠĠ ĠReferences Ġ< b >< u > under lined </ u ></ b > Ġare Ġthe Ġlikely Ġcauses Ġof Ġthe Ġleak . ĊĠĠĠĠĠ ĠLearn Ġmore Ġat Ġ< a Ġhref =" https :// squ . re / le aks "> https :// squ . re / le aks </ a > ĊĠĠĠ Ġ""" . trim Indent () Ġ+ Ġif Ġ( leak Ġis ĠLibrary Leak ) Ġ"< br >< br > Library ĠLe ak : Ġ${ leak . pattern }" Ġelse Ġ"" ĊĊĠĠĠ Ġval Ġtitle Ġ= ĠHtml . from Html ( title Text ) Ġas ĠSp ann able StringBuilder ĊĠĠĠ ĠS qu ig gly Span . replace Underline Spans ( title , Ġcontext ) ĊĊĠĠĠ Ġreplace Url Span With Action ( title ) Ġ{ Ġurl Span Ġ-> ĊĠĠĠĠĠ Ġwhen Ġ( url Span ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ" share " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare ( leak ToString ( leak , Ġanalysis )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" share _ stack _ overflow " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare To Stack Overflow ( leak ToString ( leak , Ġanalysis )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" open _ analysis " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgo To ( Heap Dump Screen ( projection . analysis Id )) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ" share _ h prof " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshare Heap Dump ( analysis . heap Dump File ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġadapter Ġ= ĠDisplay Leak Adapter ( context , Ġleak . leak Trace , Ġtitle ) ĊĠĠĠ ĠlistView . adapter Ġ= Ġadapter ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġleak ToString ( ĊĠĠĠ Ġleak : ĠLe ak , ĊĠĠĠ Ġanalysis : ĠHeap Analysis Success ĊĠ Ġ) Ġ= Ġ""" $ leak Ċ Ċ METADATA Ċ Ċ ${ if Ġ( analysis . metadata . isNotEmpty ()) Ġanalysis . metadata . map Ġ{ Ġ"${ it . key }: Ġ${ it . value }" Ġ}. join ToString ( ĊĠĠĠĠĠ Ġ"\ n " ĊĠ Ġ) Ġelse Ġ"" } Ċ Analysis Ġduration : Ġ${ analysis . analysis Duration Millis } Ġms """ Ċ }