/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġ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 Ġandroidx . camera . camera 2 . pipe . impl Ċ Ċ import Ġandroid . hardware . camera 2 . Capture Result Ċ import Ġandroidx . annotation . Gu arded By Ċ import Ġandroidx . camera . camera 2 . pipe . Frame Metadata Ċ import Ġandroidx . camera . camera 2 . pipe . Frame Number Ċ import Ġandroidx . camera . camera 2 . pipe . Request Number Ċ import Ġandroidx . camera . camera 2 . pipe . Result 3 A Ċ import Ġandroidx . camera . camera 2 . pipe . Status 3 A Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Deferred Ċ Ċ /** Ċ Ġ* ĠGiven Ġa Ġmap Ġof Ġkeys Ġand Ġa Ġlist Ġof Ġacceptable Ġvalues Ġfor Ġeach Ġkey , Ġthis Ġchecks Ġif Ġthe Ġgiven Ċ Ġ* Ġ[ Capture Result ] Ġhas Ġall Ġof Ġthose Ġkeys Ġand Ġfor Ġevery Ġkey Ġthe Ġvalue Ġfor Ġthat Ġkey Ġis Ġone Ġof Ġthe Ċ Ġ* Ġacceptable Ġvalues . ĠIf Ġthe Ġkey Ġset Ġis Ġempty Ġthen Ġthe Ġ[ update ] Ġmethod Ġreturns Ġtrue . ĠThis Ġis Ġhelpful Ċ Ġ* Ġfor Ġuse Ġcases Ġwhere Ġthe Ġvalue Ġin Ġthe Ġ[ Capture Result ] Ġmight Ġnot Ġbe Ġexactly Ġequal Ġto Ġthe Ġvalue Ċ Ġ* Ġrequested Ġvia Ġa Ġcapture Ġrequest . ĠIn Ġthose Ġcases , Ġjust Ġknowing Ġthat Ġthe Ġcorrect Ġrequest Ġwas Ċ Ġ* Ġsubmitted Ġand Ġthat Ġat Ġleast Ġone Ġcapture Ġresult Ġfor Ġthat Ġrequest Ġwas Ġreceived Ġvia Ġthe Ġ[ update ] Ċ Ġ* Ġmethod Ġshould Ġsuff ice Ġto Ġconfirm Ġthat Ġthe Ġdesired Ġkey Ġvalue Ġpairs Ġwere Ġapplied Ġby Ġthe Ġcamera Ċ Ġ* Ġdevice . Ċ Ġ* Ċ Ġ* ĠThis Ġupdate Ġmethod Ġcan Ġbe Ġcalled Ġmultiple Ġtimes Ġas Ġwe Ġget Ġnewer Ġ[ Capture Result ] s Ġfrom Ġthe Ġcamera Ċ Ġ* Ġdevice . ĠThis Ġclass Ġalso Ġexposes Ġa Ġ[ Deferred ] Ġto Ġquery Ġthe Ġstatus Ġof Ġdesired Ġstate . Ċ Ġ*/ Ċ interface ĠResult 3 A State Listener Ġ{ ĊĠĠĠ Ġfun Ġon Request Sequence Created ( request Number : ĠRequest Number ) ĊĠĠĠ Ġfun Ġupdate ( request Number : ĠRequest Number , Ġframe Metadata : ĠFrame Metadata ): ĠBoolean Ċ } Ċ Ċ class ĠResult 3 A State Listener Impl Ġ( ĊĠĠĠ Ġprivate Ġval Ġexit Condition For Keys : ĠMap < Capture Result . Key <* >, ĠList < Any >>, ĊĠĠĠ Ġprivate Ġval Ġframe Limit : ĠInt ? Ġ= Ġnull , ĊĠĠĠ Ġprivate Ġval Ġtime Limit Ns : ĠLong ? Ġ= Ġnull Ċ ) Ġ: ĠResult 3 A State Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdeferred Ġ= ĠComp letable Deferred < Result 3 A >() ĊĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġframe NumberOf First Update : ĠFrame Number ? Ġ= Ġnull ĊĠĠĠ Ġ@ Volatile Ġprivate Ġvar Ġtimestamp Of First Update Ns : ĠLong ? Ġ= Ġnull ĊĠĠĠ Ġ@ Gu arded By (" this ") ĊĠĠĠ Ġprivate Ġvar Ġinitial Request Number : ĠRequest Number ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Sequence Created ( request Number : ĠRequest Number ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initial Request Number Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Request Number Ġ= Ġrequest Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( request Number : ĠRequest Number , Ġframe Metadata : ĠFrame Metadata ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġsome Ġcompute Ġif Ġthe Ġtask Ġis Ġalready Ġcomplete Ġor Ġhas Ġbeen Ġcanceled . ĊĠĠĠĠĠĠĠ Ġif Ġ( deferred . is Completed Ġ|| Ġdeferred . is Cancelled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġthe Ġupdate Ġif Ġthe Ġupdate Ġis Ġfrom Ġa Ġpreviously Ġsubmitted Ġrequest . ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Request Number Ġ= Ġinitial Request Number ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( initial Request Number Ġ== Ġnull Ġ|| Ġrequest Number . value Ġ< Ġinitial Request Number . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Timestamp Ns : ĠLong ? Ġ= Ġframe Metadata . get ( Capture Result . SENSOR _ TIMESTAMP ) ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Frame Number Ġ= Ġframe Metadata . frame Number ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current Timestamp Ns Ġ!= Ġnull Ġ&& Ġtimestamp Of First Update Ns Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Of First Update Ns Ġ= Ġcurrent Timestamp Ns ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtimestamp Of First Update Ns Ġ= Ġtimestamp Of First Update Ns ĊĠĠĠĠĠĠĠ Ġif Ġ( time Limit Ns Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Of First Update Ns Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Timestamp Ns Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Timestamp Ns Ġ- Ġtimestamp Of First Update Ns Ġ> Ġtime Limit Ns ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult 3 A ( frame Metadata . frame Number , ĠStatus 3 A . TIME _ LIMIT _ RE ACHED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( frame NumberOf First Update Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe NumberOf First Update Ġ= Ġcurrent Frame Number ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġframe NumberOf First Update Ġ= Ġframe NumberOf First Update ĊĠĠĠĠĠĠĠ Ġif Ġ( frame NumberOf First Update Ġ!= Ġnull Ġ&& Ġframe Limit Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame Number . value Ġ- Ġframe NumberOf First Update . value Ġ> Ġframe Limit ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred . complete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResult 3 A ( frame Metadata . frame Number , ĠStatus 3 A . FRAME _ LIMIT _ RE ACHED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġexit Condition For Keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue In Capture Result Ġ= Ġframe Metadata . get ( k ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! v . contains ( value In Capture Result )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdeferred . complete ( Result 3 A ( frame Metadata . frame Number , ĠStatus 3 A . OK )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Deferred Result (): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdeferred ĊĠĠĠ Ġ} Ċ } Ċ