/* Ċ Ġ* ĠCopyright Ġ 2 0 2 2 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . example . android . we arable . compose advanced . util Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . compose . ui . platform . Compose View Ċ import Ġandroidx . metrics . performance . J ank Stats Ċ import Ġandroidx . metrics . performance . Performance Metrics State Ċ import Ġcom . example . android . we arable . compose advanced . Build Config Ċ import Ġcom . example . android . we arable . compose advanced . presentation . navigation . Screen Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . as Executor Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠSimple ĠJ ank Ġlog Ġprinter . Ċ Ġ*/ Ċ class ĠJ ank Printer Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġstate Holder : ĠPerformance Metrics State . Metrics State Holder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġj ank Stats : ĠJ ank Stats ĊĠĠĠ Ġprivate Ġvar Ġnon J ank Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun ĠLong . nan os To Millis () Ġ= Ġ"${ TimeUnit . NAN O SECONDS . to Millis ( this )} ms " ĊĊĠĠĠ Ġfun Ġinstall J ank Stats ( activity : ĠActivity ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAssume ĠCompose Ġis Ġused ĊĠĠĠĠĠĠĠ Ġval Ġcontent View Ġ= Ġactivity . window . decor View . findViewById < ViewGroup >( android . R . id . content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getChild At ( 0 ) Ġas ĠCompose View ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Build Config . DEBUG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Holder Ġ= ĠPerformance Metrics State . get For Hierarchy ( content View ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. add State (" Activity ", Ġactivity . java Class . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate ?. add State (" route ", ĠScreen . Landing . route ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġj ank Stats Ġ= ĠJ ank Stats . create And Track ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . window , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDispatch ers . Default . as Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is J ank ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroute Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . states . find Ġ{ Ġstate Ġ-> Ġstate . state Name Ġ== Ġ" route " Ġ} ?. state . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġit . frame Duration Ui Nan os . nan os To Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" J ank ", Ġ" J ank Ġ$ duration Ġroute :$ route Ġnon :$ non J ank ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon J ank Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon J ank ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 3 x Ġisn 't Ġvery Ġnotice able Ġfor Ġa Ġfew Ġframes Ġand Ġset tles Ġdown Ġafter Ġthe Ġapp Ġhas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbeen Ġoptim ised . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj ank He uristic Multiplier Ġ= Ġ 3 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Route State ( route : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġstate Holder ?. state ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( route Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add State (" route ", Ġroute ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . remove State (" route ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ