/* Ċ Ġ* Ġ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 . Camera Metadata . CONTROL _ AE _ PRE CAPTURE _ TRIGGER _ START Ċ import Ġandroid . hardware . camera 2 . Capture Request . CONTROL _ AF _ TRIGGER _ CANCEL Ċ import Ġandroid . hardware . camera 2 . Capture Request . CONTROL _ AF _ TRIGGER _ START Ċ import Ġandroid . hardware . camera 2 . Capture Request Ċ import Ġandroid . hardware . camera 2 . Capture Request . CONTROL _ AE _ LOCK Ċ import Ġandroid . hardware . camera 2 . Capture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER Ċ import Ġandroid . hardware . camera 2 . Capture Request . CONTROL _ AF _ TRIGGER Ċ import Ġandroid . hardware . camera 2 . Capture Result Ċ import Ġandroid . hardware . camera 2 . params . Met ering Rectangle Ċ import Ġandroid . os . Build Ċ import Ġandroidx . annotation . Gu arded By Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . camera . camera 2 . pipe . Ae Mode Ċ import Ġandroidx . camera . camera 2 . pipe . Af Mode Ċ import Ġandroidx . camera . camera 2 . pipe . A wb Mode Ċ import Ġandroidx . camera . camera 2 . pipe . Camera Graph Ċ import Ġandroidx . camera . camera 2 . pipe . Camera Graph . Constants 3 A . FRAME _ NUMBER _ INVALID Ċ import Ġandroidx . camera . camera 2 . pipe . Flash Mode Ċ import Ġandroidx . camera . camera 2 . pipe . Lock 3 AB e havior Ċ import Ġandroidx . camera . camera 2 . pipe . Result 3 A Ċ import Ġandroidx . camera . camera 2 . pipe . Status 3 A Ċ import Ġandroidx . camera . camera 2 . pipe . Torch State Ċ import Ġandroidx . camera . camera 2 . pipe . core . Log . debug Ċ import Ġandroidx . camera . camera 2 . pipe . should Unlock Ae Ċ import Ġandroidx . camera . camera 2 . pipe . should Unlock Af Ċ import Ġandroidx . camera . camera 2 . pipe . should Unlock A wb Ċ import Ġandroidx . camera . camera 2 . pipe . should WaitFor Ae To Con ver ge Ċ import Ġandroidx . camera . camera 2 . pipe . should WaitFor Af To Con ver ge Ċ import Ġandroidx . camera . camera 2 . pipe . should WaitFor A wb To Con ver ge Ċ import Ġkotlinx . coroutines . Comp letable Deferred Ċ import Ġkotlinx . coroutines . Deferred Ċ import Ġkotlinx . coroutines . cancel Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġimplements Ġthe Ġ 3 A Ġmethods Ġof Ġ[ Camera Graph Session Impl ]. Ċ Ġ*/ Ċ internal Ġclass ĠController 3 A ( ĊĠĠĠ Ġprivate Ġval Ġgraph Processor : ĠGraph Processor , ĊĠĠĠ Ġprivate Ġval Ġgraph State 3 A : ĠGraph State 3 A , ĊĠĠĠ Ġprivate Ġval Ġgraph Listener 3 A : ĠListener 3 A Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġae Con ver ged State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ CONVER GED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ FLASH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ LOCK ED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaw b Con ver ged State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AW B _ STATE _ CONVER GED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AW B _ STATE _ LOCK ED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaf Con ver ged State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ FOC USED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ UN FOC USED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ FOC USED _ LOCK ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ NOT _ FOC USED _ LOCK ED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġae Locked State List Ġ= ĠlistOf ( Capture Result . CONTROL _ AE _ STATE _ LOCK ED ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaw b Locked State List Ġ= ĠlistOf ( Capture Result . CONTROL _ AW B _ STATE _ LOCK ED ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaf Locked State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ FOC USED _ LOCK ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ NOT _ FOC USED _ LOCK ED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġae Post Pre capture State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ CONVER GED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ FLASH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ LOCK ED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparameter For Af Trigger Start Ġ= Ġmap Of < Capture Request . Key <* >, ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AF _ TRIGGER Ġto ĠCONT ROL _ AF _ TRIGGER _ START ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparameter For Af Trigger Cancel Ġ= Ġmap Of < Capture Request . Key <* >, ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AF _ TRIGGER Ġto ĠCONT ROL _ AF _ TRIGGER _ CANCEL ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparameters For Ae Pre capture And Af Trigger Ġ= Ġmap Of < Capture Request . Key <* >, ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AF _ TRIGGER Ġto ĠCONT ROL _ AF _ TRIGGER _ START , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AE _ PRE CAPTURE _ TRIGGER Ġto ĠCONT ROL _ AE _ PRE CAPTURE _ TRIGGER _ START ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġresult 3 AS ub mit Failed Ġ= ĠResult 3 A ( FRAME _ NUMBER _ INVALID , ĠStatus 3 A . SUBMIT _ FAILED ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġae Unlock ed State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ IN ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ SEARCH ING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ CONVER GED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE _ FLASH _ REQUIRED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaf Unlock ed State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ IN ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ ACTIVE _ SCAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ SCAN , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ FOC USED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ UN FOC USED ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġaw b Unlock ed State List Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AW B _ STATE _ IN ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AW B _ STATE _ SEARCH ING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AW B _ STATE _ CONVER GED ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠKeep Ġtrack Ġof Ġthe Ġresult Ġassociated Ġwith Ġlatest Ġcall Ġto Ġupdate 3 A . ĠIf Ġupdate 3 A Ġis Ġcalled Ġagain ĊĠĠĠ Ġ// Ġand Ġthe Ġcurrent Ġresult Ġis Ġnot Ġcomplete , Ġwe Ġwill Ġcancel Ġthe Ġcurrent Ġresult . ĊĠĠĠ Ġ@ Gu arded By (" this ") ĊĠĠĠ Ġprivate Ġvar Ġlast Update 3 A Result : ĠDeferred < Result 3 A >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġupdate 3 A ( ĊĠĠĠĠĠĠĠ Ġae Mode : ĠA e Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Mode : ĠA f Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Mode : ĠA wb Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġflash Mode : ĠFlash Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġae Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġlistener Ġto Ġa Ġglobal Ġpool Ġof Ġ 3 A Ġlisteners Ġto Ġmonitor Ġthe Ġstate Ġchange Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġdesired Ġone . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġcreate Listener For 3 A Params ( ae Mode , Ġaf Mode , Ġaw b Mode , Ġflash Mode ) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġ 3 A Ġstate Ġof Ġthe Ġgraph . ĠThis Ġwill Ġmake Ġsure Ġthen Ġwhen ĠGraph Processor Ġbuilds ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġnext Ġrequest Ġit Ġwill Ġapply Ġthe Ġ 3 A Ġparameters Ġcorresponding Ġto Ġthe Ġupdated Ġ 3 A Ġstate ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġrequest . ĊĠĠĠĠĠĠĠ Ġgraph State 3 A . update ( ae Mode , Ġaf Mode , Ġaw b Mode , Ġflash Mode , Ġae Regions , Ġaf Regions , Ġaw b Regions ) ĊĠĠĠĠĠĠĠ Ġ// ĠTry Ġsubmitting Ġa Ġnew Ġrepe ating Ġrequest Ġwith Ġthe Ġ 3 A Ġparameters Ġcorresponding Ġto Ġthe Ġnew ĊĠĠĠĠĠĠĠ Ġ// Ġ 3 A Ġstate Ġand Ġcorresponding Ġlisteners . ĊĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlistener . get Deferred Result () ĊĠĠĠĠĠĠĠ Ġsynchronized ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Update 3 A Result ?. cancel (" A Ġnewer Ġcall Ġfor Ġ 3 A Ġstate Ġupdate Ġinitiated .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Update 3 A Result Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġsubmit 3 A ( ĊĠĠĠĠĠĠĠ Ġae Mode : ĠA e Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Mode : ĠA f Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Mode : ĠA wb Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġae Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Regions : ĠList < Met ering Rectangle >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġlistener Ġto Ġa Ġglobal Ġpool Ġof Ġ 3 A Ġlisteners Ġto Ġmonitor Ġthe Ġstate Ġchange Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġdesired Ġone . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġcreate Listener For 3 A Params ( ae Mode , Ġaf Mode , Ġaw b Mode ) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġval Ġextra 3 A Params Ġ= Ġmutable Map Of < Capture Request . Key <* >, ĠAny >() ĊĠĠĠĠĠĠĠ Ġae Mode ?. let Ġ{ Ġextra 3 A Params . put ( Capture Request . CONTROL _ AE _ MODE , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġaf Mode ?. let Ġ{ Ġextra 3 A Params . put ( Capture Request . CONTROL _ AF _ MODE , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġaw b Mode ?. let Ġ{ Ġextra 3 A Params . put ( Capture Request . CONTROL _ AW B _ MODE , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġae Regions ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra 3 A Params . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ REGION S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaf Regions ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra 3 A Params . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ REGION S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaw b Regions ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra 3 A Params . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AW B _ REGION S , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( extra 3 A Params )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Listener 3 A . remove Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener . get Deferred Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGiven Ġthe Ġdesired Ġlock Ġbehaviors Ġfor Ġae , Ġaf Ġand Ġaw b , Ġthis Ġmethod , Ġ( a ) Ġfirst Ġunlock s Ġthem Ġand ĊĠĠĠĠ Ġ* Ġwait Ġfor Ġthem Ġto Ġconver ge , Ġand Ġthen Ġ( b ) Ġlocks Ġthem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ( a ) ĠIn Ġthis Ġstep , Ġas Ġneeded , Ġwe Ġfirst Ġsend Ġa Ġsingle Ġrequest Ġwith Ġ' af Ġtrigger Ġ= Ġcancel ' Ġto ĊĠĠĠĠ Ġ* Ġunlock Ġaf , Ġand Ġthen Ġa Ġrepe ating Ġrequest Ġto Ġunlock Ġae Ġand Ġaw b . ĠWe Ġsuspend Ġtill Ġwe Ġreceive Ġa ĊĠĠĠĠ Ġ* Ġresponse Ġfrom Ġthe Ġcamera Ġthat Ġeach Ġof Ġthe Ġae , Ġaf Ġaw b Ġare Ġconver ged . ĊĠĠĠĠ Ġ* Ġ( b ) ĠIn Ġthis Ġstep , Ġas Ġneeded , Ġwe Ġsubmit Ġa Ġrepe ating Ġrequest Ġto Ġlock Ġae Ġand Ġaw b , Ġand Ġthen Ġa ĊĠĠĠĠ Ġ* Ġsingle Ġrequest Ġto Ġlock Ġaf Ġby Ġsetting Ġ' af Ġtrigger Ġ= Ġstart '. ĠOnce Ġthese Ġrequests Ġare Ġsubmitted ĊĠĠĠĠ Ġ* Ġwe Ġdon 't Ġwait Ġfurther Ġand Ġimmediately Ġreturn Ġa ĠDeferred < Result 3 A > Ġwhich Ġgets Ġcompleted Ġwhen ĊĠĠĠĠ Ġ* Ġthe Ġcapture Ġresult Ġwith Ġcorrect Ġlock Ġstates Ġfor Ġae , Ġaf Ġand Ġaw b Ġis Ġreceived . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġwe Ġreceived Ġan Ġerror Ġwhen Ġsubmitting Ġany Ġof Ġthe Ġabove Ġrequests Ġor Ġif Ġwaiting Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġdesired Ġ 3 A Ġstate Ġtimes Ġout Ġthen Ġwe Ġreturn Ġearly Ġwith Ġthe Ġappropriate Ġstatus Ġcode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġthe Ġframe Limit Ġand Ġtime Limit Ns Ġapplies Ġto Ġeach Ġof Ġthe Ġabove Ġsteps Ġ( a ) Ġand Ġ( b ) Ġand Ġnot ĊĠĠĠĠ Ġ* Ġas Ġa Ġwhole Ġfor Ġthe Ġwhole Ġlock 3 A Ġmethod . ĠThus , Ġin Ġthe Ġworst Ġcase Ġthis Ġmethod Ġincluding Ġthe ĊĠĠĠĠ Ġ* Ġcompletion Ġof Ġreturned ĠDeferred < Result 3 A > Ġcan Ġtake Ġ 2 Ġ* Ġmin ( time Ġequivalent Ġof Ġframe Limit , ĊĠĠĠĠ Ġ* Ġtime Limit ) Ġto Ġcomplete ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġlock 3 A ( ĊĠĠĠĠĠĠĠ Ġae Lock Behavior : ĠLock 3 AB e havior ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Lock Behavior : ĠLock 3 AB e havior ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Lock Behavior : ĠLock 3 AB e havior ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġframe Limit : ĠInt Ġ= ĠCamera Graph . DEFAULT _ FRAME _ LIMIT , ĊĠĠĠĠĠĠĠ Ġtime Limit Ns : ĠLong ? Ġ= ĠCamera Graph . DEFAULT _ TIME _ LIMIT _ NS ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġexplicitly Ġneed Ġto Ġunlock Ġaf Ġfirst Ġbefore Ġproceed ing Ġto Ġlock Ġit , Ġwe Ġneed Ġto Ġsend ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġsingle Ġrequest Ġwith ĠTR IG GER Ġ= ĠTR IG GER _ CANCEL Ġso Ġthat Ġaf Ġcan Ġstart Ġa Ġfresh Ġscan . ĊĠĠĠĠĠĠĠ Ġif Ġ( af Lock Behavior . should Unlock Af ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" lock 3 A Ġ- Ġsending Ġa Ġrequest Ġto Ġunlock Ġaf Ġfirst ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( parameter For Af Trigger Cancel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAs Ġneeded Ġunlock Ġae , Ġaw b Ġand Ġwait Ġfor Ġae , Ġaf Ġand Ġaw b Ġto Ġconver ge . ĊĠĠĠĠĠĠĠ Ġif Ġ( ae Lock Behavior . should WaitFor Ae To Con ver ge () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaf Lock Behavior . should WaitFor Af To Con ver ge () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw b Lock Behavior . should WaitFor A wb To Con ver ge () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconver ged 3 A Exit Conditions Ġ= Ġcreate Con ver ged 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġae Lock Behavior . should WaitFor Ae To Con ver ge (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaf Lock Behavior . should WaitFor Af To Con ver ge (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaw b Lock Behavior . should WaitFor A wb To Con ver ge () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconver ged 3 A Exit Conditions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Limit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Limit Ns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġhave Ġto Ġexplicitly Ġunlock Ġae , Ġaw b , Ġthen Ġupdate Ġthe Ġ 3 A Ġstate Ġof Ġthe Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġgraph . ĠThis Ġis Ġbecause Ġae , Ġaw b Ġlock Ġvalues Ġshould Ġstay Ġas Ġpart Ġof Ġrepe ating ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġto Ġthe Ġcamera Ġdevice . ĠFor Ġaf Ġwe Ġneed Ġonly Ġone Ġsingle Ġrequest Ġto Ġtrigger Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġleaving Ġit Ġunset Ġin Ġthe Ġsubsequent Ġrequests Ġto Ġthe Ġcamera Ġdevice Ġwill Ġnot Ġaffect Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpreviously Ġsent Ġaf Ġtrigger . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġae Lock Value Ġ= Ġif Ġ( ae Lock Behavior . should Unlock Ae ()) Ġfalse Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaw b Lock Value Ġ= Ġif Ġ( aw b Lock Behavior . should Unlock A wb ()) Ġfalse Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ae Lock Value Ġ!= Ġnull Ġ|| Ġaw b Lock Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" lock 3 A Ġ- Ġsetting Ġae Lock =$ ae Lock Value , Ġaw b Lock =$ aw b Lock Value " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgraph State 3 A . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġae Lock Ġ= Ġae Lock Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaw b Lock Ġ= Ġaw b Lock Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock 3 A Ġ- Ġwaiting Ġfor " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( ae Lock Behavior . should WaitFor Ae To Con ver ge ()) Ġ" Ġae " Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( af Lock Behavior . should WaitFor Af To Con ver ge ()) Ġ" Ġaf " Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( if Ġ( aw b Lock Behavior . should WaitFor A wb To Con ver ge ()) Ġ" Ġaw b " Ġelse Ġ"") Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġto Ġconver ge Ġbefore Ġlocking Ġthem ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġlistener . get Deferred Result (). await () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock 3 A Ġ- Ġconver ged Ġat Ġframe Ġnumber =${ result . frame Number . value }, Ġstatus =${ result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. status }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġimmediately Ġif Ġwe Ġencounter Ġan Ġerror Ġwhen Ġunlock ing Ġand Ġwaiting Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconvergence . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . status Ġ!= ĠStatus 3 A . OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlock 3 AN ow ( ae Lock Behavior , Ġaf Lock Behavior , Ġaw b Lock Behavior , Ġframe Limit , Ġtime Limit Ns ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġunlock s Ġae , Ġaf Ġand Ġaw b , Ġas Ġspecified Ġby Ġsetting Ġthe Ġcorresponding Ġparameter Ġto ĊĠĠĠĠ Ġ* Ġtrue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġrequests Ġinvolved Ġin Ġthis Ġoperation , Ġ( a ) Ġa Ġsingle Ġrequest Ġwith Ġaf Ġtrigger Ġ= ĊĠĠĠĠ Ġ* Ġcancel , Ġto Ġunlock Ġaf , Ġand Ġthen Ġ( a ) Ġa Ġrepe ating Ġrequest Ġto Ġunlock Ġae , Ġaw b . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġunlock 3 A ( ĊĠĠĠĠĠĠĠ Ġae : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b : ĠBoolean ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( ae Ġ== Ġtrue Ġ|| Ġaf Ġ== Ġtrue Ġ|| Ġaw b Ġ== Ġtrue ) Ġ{ Ġ" No Ġparameter Ġhas Ġvalue Ġas Ġtrue " Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġwe Ġexplicitly Ġneed Ġto Ġunlock Ġaf Ġfirst Ġbefore Ġproceed ing Ġto Ġlock Ġit , Ġwe Ġneed Ġto Ġsend ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġsingle Ġrequest Ġwith ĠTR IG GER Ġ= ĠTR IG GER _ CANCEL Ġso Ġthat Ġaf Ġcan Ġstart Ġa Ġfresh Ġscan . ĊĠĠĠĠĠĠĠ Ġif Ġ( af Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A Ġ- Ġsending Ġa Ġrequest Ġto Ġunlock Ġaf Ġfirst ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( parameter For Af Trigger Cancel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A Ġ- Ġrequest Ġto Ġunlock Ġaf Ġfailed , Ġreturning Ġearly ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAs Ġneeded Ġunlock Ġae , Ġaw b Ġand Ġwait Ġfor Ġae , Ġaf Ġand Ġaw b Ġto Ġconver ge . ĊĠĠĠĠĠĠĠ Ġval Ġun locked 3 A Exit Conditions Ġ= Ġcreate Un Locked 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġae Ġ== Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaf Ġ== Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaw b Ġ== Ġtrue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( unlocked 3 A Exit Conditions ) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġthe Ġ 3 A Ġstate Ġof Ġthe Ġcamera Ġgraph Ġand Ġinvalidate Ġthe Ġrepe ating Ġrequest Ġwith Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġnew Ġstate . ĊĠĠĠĠĠĠĠ Ġval Ġae Lock Value Ġ= Ġif Ġ( ae Ġ== Ġtrue ) Ġfalse Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġaw b Lock Value Ġ= Ġif Ġ( aw b Ġ== Ġtrue ) Ġfalse Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( ae Lock Value Ġ!= Ġnull Ġ|| Ġaw b Lock Value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A Ġ- Ġupdating Ġgraph Ġstate , Ġae Lock =$ ae Lock Value , Ġaw b Lock =$ aw b Lock Value " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph State 3 A . update ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġae Lock Ġ= Ġae Lock Value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaw b Lock Ġ= Ġaw b Lock Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener . get Deferred Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġlock 3 A For Capture ( ĊĠĠĠĠĠĠĠ Ġframe Limit : ĠInt Ġ= ĠCamera Graph . DEFAULT _ FRAME _ LIMIT , ĊĠĠĠĠĠĠĠ Ġtime Limit Ns : ĠLong Ġ= ĠCamera Graph . DEFAULT _ TIME _ LIMIT _ NS ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of < Capture Result . Key <* >, ĠList < Any >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AE _ STATE Ġto Ġae Post Pre capture State List , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE Ġto Ġaf Locked State List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Limit , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Limit Ns ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" lock 3 A For Capture Ġ- Ġsending Ġa Ġrequest Ġto Ġtrigger Ġae Ġpre capture Ġmeter ing Ġand Ġaf ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( parameters For Ae Pre capture And Af Trigger )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock 3 A For Capture Ġ- Ġrequest Ġto Ġtrigger Ġae Ġpre capture Ġmeter ing Ġand Ġaf Ġfailed , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return ing Ġearly ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Listener 3 A . remove Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener . get Deferred Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġunlock 3 AP ost Capture (): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġunlock 3 AP ost Capture Android M And Above () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġunlock 3 AP ost Capture Android L And Below () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġapi Ġlevel Ġbelow Ġ 2 3 , Ġto Ġresume Ġthe Ġnormal Ġscan Ġof Ġae Ġafter Ġpre capture Ġmeter ing ĊĠĠĠĠ Ġ* Ġsequence , Ġwe Ġhave Ġto Ġfirst Ġsend Ġa Ġrequest Ġwith Ġae Ġlock Ġ= Ġtrue Ġand Ġthen Ġa Ġrequest Ġwith Ġae ĊĠĠĠĠ Ġ* Ġlock Ġ= Ġfalse . ĠREF Ġ: ĊĠĠĠĠ Ġ* Ġhttps :// developer . android . com / reference / android / hardware / camera 2 / Capture Request # CONTROL _ AE _ PRE CAPTURE _ TRIGGER ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġunlock 3 AP ost Capture Android L And Below (): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A For Capture Ġ- Ġsending Ġa Ġrequest Ġto Ġcancel Ġaf Ġand Ġturn Ġon Ġae ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AF _ TRIGGER Ġto ĠCONT ROL _ AF _ TRIGGER _ CANCEL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AE _ LOCK Ġto Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A For Capture Ġ- Ġrequest Ġto Ġcancel Ġaf Ġand Ġlock Ġae Ġas Ġfailed ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠListener Ġto Ġmonitor Ġwhen Ġwe Ġreceive Ġthe Ġcapture Ġresult Ġcorresponding Ġto Ġthe Ġrequest ĊĠĠĠĠĠĠĠ Ġ// Ġbelow . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( map Of ()) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A For Capture Ġ- Ġsending Ġa Ġrequest Ġto Ġturn Ġoff Ġae ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( map Of < Capture Request . Key <* >, ĠAny >( CONTROL _ AE _ LOCK Ġto Ġfalse ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 A For Capture Ġ- Ġrequest Ġto Ġunlock Ġae Ġfailed ." Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Listener 3 A . remove Listener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlistener . get Deferred Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor ĠAPI Ġlevel Ġ 2 3 Ġor Ġnewer Ġversions , Ġthe Ġsending Ġa Ġrequest Ġwith ĊĠĠĠĠ Ġ* ĠCONT ROL _ AE _ PRE CAPTURE _ TRIGGER Ġ= ĠCANCEL Ġcan Ġbe Ġused Ġto Ġunlock Ġthe Ġcamera Ġdevice 's ĊĠĠĠĠ Ġ* Ġinternally Ġlocked ĠAE . ĠREF Ġ: ĊĠĠĠĠ Ġ* Ġhttps :// developer . android . com / reference / android / hardware / camera 2 / Capture Request # CONTROL _ AE _ PRE CAPTURE _ TRIGGER ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Requires Api ( 2 3 ) ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġunlock 3 AP ost Capture Android M And Above (): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" unlock 3 AP ost Capture Ġ- Ġsending Ġa Ġrequest Ġto Ġreset Ġaf Ġand Ġae Ġpre capture Ġmeter ing ." Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparameters For Ae Pre capture And Af Cancel Ġ= Ġmap Of < Capture Request . Key <* >, ĠAny >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AF _ TRIGGER Ġto ĠCONT ROL _ AF _ TRIGGER _ CANCEL , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCONT ROL _ AE _ PRE CAPTURE _ TRIGGER Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER _ CANCEL ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( parameters For Ae Pre capture And Af Cancel )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" unlock 3 AP ost Capture Ġ- Ġrequest Ġto Ġreset Ġaf Ġand Ġae Ġpre capture Ġmeter ing Ġfailed , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" return ing Ġearly ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSending Ġa Ġrequest Ġwith Ġae Ġpre capture Ġtrigger Ġ= Ġcancel Ġdoes Ġnot Ġhave Ġany Ġspecific Ġaffect ĊĠĠĠĠĠĠĠ Ġ// Ġon Ġthe Ġae Ġstate , Ġso Ġwe Ġdon 't Ġneed Ġto Ġlisten Ġfor Ġa Ġspecific Ġstate . ĠAs Ġlong Ġas Ġthe Ġrequest ĊĠĠĠĠĠĠĠ Ġ// Ġsuccessfully Ġreaches Ġthe Ġcamera Ġdevice Ġand Ġthe Ġcapture Ġrequest Ġcorresponding Ġto Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġrequest Ġar rives Ġback , Ġit Ġshould Ġsuff ice . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of < Capture Result . Key <* >, ĠList < Any >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE Ġto Ġaf Unlock ed State List ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĠĠĠĠĠĠĠ Ġreturn Ġlistener . get Deferred Result () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Torch ( torch State : ĠT orch State ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDetermine Ġthe Ġflash Ġmode Ġbased Ġon Ġthe Ġtorch Ġstate . ĊĠĠĠĠĠĠĠ Ġval Ġflash Mode Ġ= Ġif Ġ( torch State Ġ== ĠT orch State . ON ) ĠFlash Mode . TOR CH Ġelse ĠFlash Mode . OFF ĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġuse Ġthe Ġflash Ġcontrol , ĠAE Ġmode Ġmust Ġbe Ġset Ġto ĠON Ġor ĠOFF . ĊĠĠĠĠĠĠĠ Ġval Ġcurr Ae Mode Ġ= Ġgraph State 3 A . ae Mode ĊĠĠĠĠĠĠĠ Ġval Ġdesired Ae Mode Ġ= Ġif Ġ( curr Ae Mode Ġ== ĠA e Mode . ON Ġ|| Ġcurr Ae Mode Ġ== ĠA e Mode . OFF ) Ġnull Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠA e Mode . ON ĊĠĠĠĠĠĠĠ Ġreturn Ġupdate 3 A ( ae Mode Ġ= Ġdesired Ae Mode , Ġflash Mode Ġ= Ġflash Mode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġlock 3 AN ow ( ĊĠĠĠĠĠĠĠ Ġae Lock Behavior : ĠLock 3 AB e havior ?, ĊĠĠĠĠĠĠĠ Ġaf Lock Behavior : ĠLock 3 AB e havior ?, ĊĠĠĠĠĠĠĠ Ġaw b Lock Behavior : ĠLock 3 AB e havior ?, ĊĠĠĠĠĠĠĠ Ġframe Limit : ĠInt ?, ĊĠĠĠĠĠĠĠ Ġtime Limit Ns : ĠLong ? ĊĠĠĠ Ġ): ĠDeferred < Result 3 A > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfinal Ae Lock Value Ġ= Ġif Ġ( ae Lock Behavior Ġ== Ġnull ) Ġnull Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġfinal A wb Lock Value Ġ= Ġif Ġ( aw b Lock Behavior Ġ== Ġnull ) Ġnull Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġlocked 3 A Exit Conditions Ġ= Ġcreate Locked 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Ae Lock Value Ġ!= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaf Lock Behavior Ġ!= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinal A wb Lock Value Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult For Locked : ĠDeferred < Result 3 A >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( locked 3 A Exit Conditions . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠResult 3 A State Listener Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocked 3 A Exit Conditions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Limit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Limit Ns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Listener 3 A . addListener ( listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph State 3 A . update ( ae Lock Ġ= Ġfinal Ae Lock Value , Ġaw b Lock Ġ= Ġfinal A wb Lock Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lock 3 A Ġ- Ġsubmitting Ġrequest Ġwith Ġae Lock =$ final Ae Lock Value Ġ, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" aw b Lock =$ final A wb Lock Value " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgraph Processor . invalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult For Locked Ġ= Ġlistener . get Deferred Result () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( af Lock Behavior Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult For Locked !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdebug Ġ{ Ġ" lock 3 A Ġ- Ġsubmitting Ġa Ġrequest Ġto Ġlock Ġaf ." Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! graph Processor . submit ( parameter For Af Trigger Start )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ( s ush il n ath @ ): ĠChange Ġthe Ġerror Ġcode Ġto Ġa Ġmore Ġspecific Ġcode Ġso Ġit 's Ġclear ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġone Ġof Ġthe Ġrequest Ġin Ġsequence Ġof Ġrequests Ġfailed Ġand Ġthe Ġcaller Ġshould ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunlock Ġ 3 A Ġto Ġbring Ġthe Ġ 3 A Ġsystem Ġto Ġan Ġinitial Ġstate Ġand Ġthen Ġtry Ġagain Ġif Ġthey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwant Ġto . ĠThe Ġother Ġoption Ġis Ġto Ġreset Ġor Ġrestore Ġthe Ġ 3 A Ġstate Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠComp letable Deferred ( result 3 AS ub mit Failed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult For Locked !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Con ver ged 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠ ĠwaitFor Ae To Con ver ge : ĠBoolean , ĊĠĠĠĠĠĠĠ ĠwaitFor Af To Con ver ge : ĠBoolean , ĊĠĠĠĠĠĠĠ ĠwaitFor A wb To Con ver ge : ĠBoolean ĊĠĠĠ Ġ): ĠMap < Capture Result . Key <* >, ĠList < Any >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! waitFor Ae To Con ver ge Ġ&& Ġ! waitFor Af To Con ver ge Ġ&& Ġ! waitFor A wb To Con ver ge ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexit Condition Map For Con ver ged Ġ= Ġmutable Map Of < Capture Result . Key <* >, ĠList < Any >>() ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor Ae To Con ver ge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Con ver ged [ Capture Result . CONTROL _ AE _ STATE ] Ġ= Ġae Con ver ged State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor A wb To Con ver ge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Con ver ged [ Capture Result . CONTROL _ AW B _ STATE ] Ġ= Ġaw b Con ver ged State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor Af To Con ver ge ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Con ver ged [ Capture Result . CONTROL _ AF _ STATE ] Ġ= Ġaf Con ver ged State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexit Condition Map For Con ver ged ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Locked 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠ ĠwaitFor Ae To Lock : ĠBoolean , ĊĠĠĠĠĠĠĠ ĠwaitFor Af To Lock : ĠBoolean , ĊĠĠĠĠĠĠĠ ĠwaitFor A wb To Lock : ĠBoolean ĊĠĠĠ Ġ): ĠMap < Capture Result . Key <* >, ĠList < Any >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! waitFor Ae To Lock Ġ&& Ġ! waitFor Af To Lock Ġ&& Ġ! waitFor A wb To Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexit Condition Map For Locked Ġ= Ġmutable Map Of < Capture Result . Key <* >, ĠList < Any >>() ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor Ae To Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Locked [ Capture Result . CONTROL _ AE _ STATE ] Ġ= Ġae Locked State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor Af To Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Locked [ Capture Result . CONTROL _ AF _ STATE ] Ġ= Ġaf Locked State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( waitFor A wb To Lock ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Locked [ Capture Result . CONTROL _ AW B _ STATE ] Ġ= Ġaw b Locked State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexit Condition Map For Locked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Un Locked 3 A Exit Conditions ( ĊĠĠĠĠĠĠĠ Ġae : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġaf : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġaw b : ĠBoolean ĊĠĠĠ Ġ): ĠMap < Capture Result . Key <* >, ĠList < Any >> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ae Ġ&& Ġ! af Ġ&& Ġ! aw b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmap Of () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexit Condition Map For Un Locked Ġ= Ġmutable Map Of < Capture Result . Key <* >, ĠList < Any >>() ĊĠĠĠĠĠĠĠ Ġif Ġ( ae ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Un Locked [ Capture Result . CONTROL _ AE _ STATE ] Ġ= Ġae Unlock ed State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( af ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Un Locked [ Capture Result . CONTROL _ AF _ STATE ] Ġ= Ġaf Unlock ed State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( aw b ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Condition Map For Un Locked [ Capture Result . CONTROL _ AW B _ STATE ] Ġ= Ġaw b Unlock ed State List ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexit Condition Map For Un Locked ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠWe Ġcreate Ġa Ġmap Ġfor Ġthe Ġ 3 A Ġmodes Ġand Ġthe Ġdesired Ġvalues Ġand Ġleave Ġout Ġthe Ġkeys ĊĠĠĠ Ġ// Ġcorresponding Ġto Ġthe Ġmeter ing Ġregions . ĠThe Ġreason Ġbeing Ġthe Ġcamera Ġframework Ġcan Ġchose Ġto ĊĠĠĠ Ġ// Ġcrop Ġor Ġmodify Ġthe Ġmeter ing Ġregions Ġas Ġper Ġits Ġconstraints . ĠSo Ġwhen Ġwe Ġreceive Ġat Ġleast ĊĠĠĠ Ġ// Ġone Ġcapture Ġresult Ġcorresponding Ġto Ġthis Ġrequest Ġit Ġis Ġassumed Ġthat Ġthe Ġframework Ġhas ĊĠĠĠ Ġ// Ġapplied Ġthe Ġdesired Ġmeter ing Ġregions Ġto Ġthe Ġbest Ġof Ġits Ġjudge ment , Ġand Ġwe Ġdon 't Ġneed Ġan ĊĠĠĠ Ġ// Ġexact Ġmatch Ġbetween Ġthe Ġmeter ing Ġregions Ġsent Ġin Ġthe Ġcapture Ġrequest Ġand Ġthe Ġmeter ing ĊĠĠĠ Ġ// Ġregions Ġreceived Ġfrom Ġthe Ġcamera Ġdevice . ĊĠĠĠ Ġprivate Ġfun Ġcreate Listener For 3 A Params ( ĊĠĠĠĠĠĠĠ Ġae Mode : ĠA e Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaf Mode : ĠA f Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġaw b Mode : ĠA wb Mode ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġflash Mode : ĠFlash Mode ? Ġ= Ġnull , ĊĠĠĠ Ġ): ĠResult 3 A State Listener Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Modes Map Ġ= Ġmutable Map Of < Capture Result . Key <* >, ĠList < Any >>() ĊĠĠĠĠĠĠĠ Ġae Mode ?. let Ġ{ Ġresult Modes Map . put ( Capture Result . CONTROL _ AE _ MODE , ĠlistOf ( it . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġaf Mode ?. let Ġ{ Ġresult Modes Map . put ( Capture Result . CONTROL _ AF _ MODE , ĠlistOf ( it . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġaw b Mode ?. let Ġ{ Ġresult Modes Map . put ( Capture Result . CONTROL _ AW B _ MODE , ĠlistOf ( it . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġflash Mode ?. let Ġ{ Ġresult Modes Map . put ( Capture Result . FLASH _ MODE , ĠlistOf ( it . value )) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResult 3 A State Listener Impl ( result Modes Map . toMap ()) ĊĠĠĠ Ġ} Ċ }