/* č Ċ * ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC č Ċ * č Ċ * Ġ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 . sin bar am . map go . AR . Helper čĊč Ċ import Ġandroidx . lifecycle . Default Lifecycle Observer č Ċ import Ġandroidx . lifecycle . Lifecycle Owner čĊč Ċ /** ĠHelper Ġto Ġmeasure Ġframe - to - frame Ġtiming Ġand Ġframe Ġrate . Ġ Ġ*/ č Ċ class ĠFrame Time Helper Ġ: ĠDefault Lifecycle Observer Ġ{ čĊĠĠĠ Ġ// ĠSystem Ġtime Ġof Ġlast Ġframe , Ġor Ġzero Ġif Ġno Ġtime Ġhas Ġbeen Ġrecorded . čĊĠĠĠ Ġprivate Ġvar Ġprevious Frame Time : ĠLong Ġ= Ġ 0 čĊčĊĠĠĠ Ġ/** ĠDetermine Ġs mo ot hed Ġframe - to - frame Ġtime . ĠReturns Ġzero Ġif Ġframe Ġtime Ġcannot Ġbe Ġdetermined . Ġ Ġ*/ čĊĠĠĠ Ġ// ĠS mo ot hed Ġframe Ġtime , Ġor Ġzero Ġif Ġframe Ġtime Ġhas Ġnot Ġyet Ġbeen Ġrecorded . čĊĠĠĠ Ġvar Ġs mo ot hed Frame Time Ġ= Ġ 0 f čĊĠĠĠĠĠĠĠ Ġprivate Ġset čĊčĊĠĠĠ Ġoverride Ġfun Ġon Resume ( owner : ĠLifecycle Owner ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġtiming Ġdata Ġduring Ġinitialization Ġand Ġafter Ġapp Ġpause . čĊĠĠĠĠĠĠĠ Ġprevious Frame Time Ġ= Ġ 0 čĊĠĠĠĠĠĠĠ Ġs mo ot hed Frame Time Ġ= Ġ 0 f čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** ĠCapture Ġcurrent Ġframe Ġtimestamp Ġand Ġcalculate Ġs mo ot hed Ġframe - to - frame Ġtime . Ġ Ġ*/ čĊĠĠĠ Ġfun Ġnext Frame () Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠSystem . currentTimeMillis () čĊčĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġnext Frame () Ġbeing Ġcalled Ġfor Ġthe Ġfirst Ġtime ? čĊĠĠĠĠĠĠĠ Ġif Ġ( previous Frame Time Ġ== Ġ 0 L ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Frame Time Ġ= Ġnow čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnable Ġto Ġcalculate Ġframe Ġtime Ġbased Ġon Ġsingle Ġtimestamp . čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs mo ot hed Frame Time Ġ= Ġ 0 f čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġmoment ary Ġframe - to - frame Ġtime . čĊĠĠĠĠĠĠĠ Ġval Ġframe Time Ġ= Ġnow Ġ- Ġprevious Frame Time čĊčĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġcurrent Ġframe Ġtime Ġas Ġprevious Ġframe Ġtime Ġduring Ġnext Ġinvocation . čĊĠĠĠĠĠĠĠ Ġprevious Frame Time Ġ= Ġnow čĊčĊĠĠĠĠĠĠĠ Ġ// ĠIs Ġnext Frame () Ġbeing Ġcalled Ġfor Ġthe Ġsecond Ġtime , Ġin Ġwhich Ġcase Ġwe Ġhave Ġonly Ġone Ġmeasurement . čĊĠĠĠĠĠĠĠ Ġif Ġ( smo ot hed Frame Time Ġ== Ġ 0 f ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġs mo ot hed Frame Time Ġ= Ġframe Time . toFloat () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// ĠIn Ġall Ġsubsequent Ġcalls Ġto Ġnext Frame (), Ġcalculated Ġa Ġs mo ot hed Ġframe Ġrate . čĊĠĠĠĠĠĠĠ Ġs mo ot hed Frame Time Ġ+= ĠS MO OTH ING _ FACTOR Ġ* Ġ( frame Time Ġ- Ġs mo ot hed Frame Time ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** ĠDetermine Ġs mo ot hed Ġframe Ġrate . ĠReturns Ġzero Ġif Ġframe Ġrate Ġcannot Ġbe Ġdetermined . Ġ Ġ*/ čĊĠĠĠ Ġval Ġs mo ot hed Frame Rate : ĠFloat čĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( smo ot hed Frame Time Ġ== Ġ 0 f ) Ġ 0 f Ġelse ĠMIL LI SECONDS _ PER _ SECOND Ġ/ Ġs mo ot hed Frame Time čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġ// ĠNumber Ġof Ġmilliseconds Ġin Ġone Ġsecond . čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIL LI SECONDS _ PER _ SECOND Ġ= Ġ 1 0 0 0 f čĊčĊĠĠĠĠĠĠĠ Ġ// ĠRate Ġby Ġwhich Ġs mo ot hed Ġframe Ġrate Ġshould Ġapproach Ġmoment ary Ġframe Ġrate . čĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS MO OTH ING _ FACTOR Ġ= Ġ. 0 3 f čĊĠĠĠ Ġ} č Ċ } čĊ