/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġ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 . internal Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . hardware . camera 2 . Camera Capture Session Ċ import Ġandroid . hardware . camera 2 . Camera Character istics Ċ import Ġandroid . hardware . camera 2 . Camera Device Ċ import Ġandroid . hardware . camera 2 . Camera Manager Ċ import Ġandroid . hardware . camera 2 . Camera Metadata Ċ import Ġandroid . hardware . camera 2 . Capture Request Ċ import Ġandroid . hardware . camera 2 . Total Capture Result Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroidx . camera . camera 2 . impl . Camera 2 Impl Config Ċ import Ġandroidx . camera . camera 2 . internal . compat . Camera Character istics Compat Ċ import Ġandroidx . camera . camera 2 . internal . compat . quir k . Camera Qu ir ks Ċ import Ġandroidx . camera . camera 2 . internal . compat . quir k . Use Torch As Flash Qu irk Ċ import Ġandroidx . camera . core . Image Capture Ċ import Ġandroidx . camera . core . Image Capture . FLASH _ TYPE _ ONE _ SHOT _ FLASH Ċ import Ġandroidx . camera . core . Image Capture . FLASH _ TYPE _ USE _ TOR CH _ AS _ FLASH Ċ import Ġandroidx . camera . core . impl . Camera Control Internal Ċ import Ġandroidx . camera . core . impl . Capture Config Ċ import Ġandroidx . camera . core . impl . Qu ir ks Ċ import Ġandroidx . camera . core . impl . Session Config Ċ import Ġandroidx . camera . core . impl . utils . executor . Camera X Executors Ċ import Ġandroidx . camera . testing . Handler Util Ċ import Ġandroidx . core . os . Handler Compat Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . google . common . truth . Truth . assert With Message Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Captor Ċ import Ġorg . mockito . Argument Matchers . any Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . mockito . Mockito . never Ċ import Ġorg . mockito . Mockito . reset Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġorg . ro bo lectric . annotation . internal . DoNot Instrument Ċ import Ġorg . ro bo lectric . shadow . api . Shadow Ċ import Ġorg . ro bo lectric . shadow s . Shadow Camera Character istics Ċ import Ġorg . ro bo lectric . shadow s . Shadow Camera Manager Ċ Ċ private Ġconst Ġval ĠCAM ERA _ ID _ 0 Ġ= Ġ" 0 " Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ DoNot Instrument Ċ @ Config ( ĊĠĠĠ Ġmin Sdk Ġ= ĠBuild . VERSION _ CODES . LO L LI POP Ċ ) Ċ class ĠCamera 2 Camera Control Impl Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontext Ġ= ĠApplication Provider . getApplicationContext () Ġas ĠContext ĊĠĠĠ Ġprivate Ġval Ġcontrol Update Callback Ġ= ĊĠĠĠĠĠĠĠ Ġmock ( Camera Control Internal . Control Update Callback :: class . java ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Control : ĠCamera 2 Camera Control Impl ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler Thread : ĠHandler Thread ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġhandler : ĠHandler ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Cam eras () ĊĊĠĠĠĠĠĠĠ Ġhandler Thread Ġ= ĠHandler Thread (" Control Thread "). apply Ġ{ Ġstart () Ġ} ĊĠĠĠĠĠĠĠ Ġhandler Ġ= ĠHandler Compat . create Async ( handler Thread . lo oper ) ĊĊĠĠĠĠĠĠĠ Ġcreate Camera Control () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(:: handler Thread . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread . quit S af ely () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtrigger Af _ capture Request Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . trigger Af () ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Af Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancel Af _ capture Request Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . trigger Af () ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( true , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Cancel Af Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ ae Pre capture Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Ae Pre capture Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ flash Mode Was Set () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct Ġ 1 ĊĠĠĠĠĠĠĠ Ġcamera Control . flash Mode Ġ= ĠImage Capture . FLASH _ MODE _ ON ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġ 1 : Ġensures ĠA e Pre capture Ġis Ġnot Ġinvoked . ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Capture Requests ( any ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct Ġ 2 : ĠSend Ġthe ĠCapture Result ĊĠĠĠĠĠĠĠ Ġval Ġtag Bundle Ġ= Ġcamera Control . session Config . repe ating Capture Config . tag Bundle ĊĠĠĠĠĠĠĠ Ġval Ġmock Capture Request Ġ= Ġmock ( Capture Request :: class . java ) ĊĠĠĠĠĠĠĠ Ġ` when `( mock Capture Request . tag ). thenReturn ( tag Bundle ) ĊĠĠĠĠĠĠĠ Ġval Ġmock Capture Result Ġ= Ġmock ( Total Capture Result :: class . java ) ĊĠĠĠĠĠĠĠ Ġ` when `( mock Capture Result . request ). thenReturn ( mock Capture Request ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( camera Capture Callback Ġin Ġcamera Control . session Config . repe ating Camera Capture Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallback Ġ= ĠCapture Callback Converter . to Capture Callback ( camera Capture Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Capture Completed ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock ( Camera Capture Session :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock Capture Request , Ġmock Capture Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert Ġ 2 : ĠA e Pre capture Ġis Ġtriggered . ĊĠĠĠĠĠĠĠ Ġassert Ae Pre capture Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Config ( min Sdk Ġ= Ġ 2 3 ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfinish Flash Sequence _ cancel Ae Pre capture Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( false , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Cancel Ae Pre capture Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancel Af And Finish Flash Sequence _ cancel Af And Ae Pre capture Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( true , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Cancel Af Trigger () ĊĠĠĠĠĠĠĠ Ġassert Cancel Ae Pre capture Trigger () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ with Torch As Flash Qu irk _ enable Torch Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control ( quir ks Ġ= ĠQu ir ks ( listOf ( object Ġ: ĠUse Torch As Flash Qu irk Ġ{} ))) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Torch Enable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ with Flash Type Torch _ enable Torch Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ USE _ TOR CH _ AS _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Torch Enable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ with Template Record _ enable Torch Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcamera Control . set Template ( Camera Device . TEMPLATE _ RECORD ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Torch Enable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfinish Flash Sequence _ with Use Torch As Flash Qu irk _ disable Torch () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control ( quir ks Ġ= ĠQu ir ks ( listOf ( object Ġ: ĠUse Torch As Flash Qu irk Ġ{} ))) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( false , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Torch Disable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġfinish Flash Sequence _ with Flash Type Torch _ disable Torch () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ USE _ TOR CH _ AS _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( false , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġassert Torch Disable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ with Use Torch As Flash Qu irk _ torch Is Already On () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control ( quir ks Ġ= ĠQu ir ks ( listOf ( object Ġ: ĠUse Torch As Flash Qu irk Ġ{} ))) ĊĠĠĠĠĠĠĠ Ġcamera Control . enable Torch Internal ( true ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ ONE _ SHOT _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Capture Requests ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Update Session Config () ĊĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( false , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Capture Requests ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Update Session Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġstart Flash Sequence _ with Flash Type Torch _ torch Is Already On () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcreate Camera Control () ĊĠĠĠĠĠĠĠ Ġcamera Control . enable Torch Internal ( true ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . start Flash Sequence ( FLASH _ TYPE _ USE _ TOR CH _ AS _ FLASH ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Capture Requests ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Update Session Config () ĊĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġreset ( control Update Callback ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . cancel Af And Finish Flash Sequence ( false , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Capture Requests ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback , Ġnever ()). on Camera Control Update Session Config () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsubmit Still Capture Requests _ with Template _ template Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġimage Capture Config Ġ= ĠCapture Config . Builder (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . template Type Ġ= ĠCamera Device . TEMPLATE _ MAN UAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . submit Still Capture Requests ( listOf ( image Capture Config )) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġval Ġcapture Config Ġ= Ġget Iss ued Capture Config () ĊĠĠĠĠĠĠĠ ĠassertThat ( capture Config . template Type ). isEqualTo ( Camera Device . TEMPLATE _ MAN UAL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsubmit Still Capture Requests _ with No Template _ template Still Capture Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġimage Capture Config Ġ= ĠCapture Config . Builder (). build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . submit Still Capture Requests ( listOf ( image Capture Config )) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġval Ġcapture Config Ġ= Ġget Iss ued Capture Config () ĊĠĠĠĠĠĠĠ ĠassertThat ( capture Config . template Type ). isEqualTo ( Camera Device . TEMPLATE _ ST ILL _ CAPTURE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsubmit Still Capture Requests _ with Template Record _ template Video Snapshot Sent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġcamera Control . set Template ( Camera Device . TEMPLATE _ RECORD ) ĊĠĠĠĠĠĠĠ Ġval Ġimage Capture Config Ġ= ĠCapture Config . Builder (). build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera Control . submit Still Capture Requests ( listOf ( image Capture Config )) ĊĠĠĠĠĠĠĠ ĠHandler Util . waitFor Looper To Idle ( handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġval Ġcapture Config Ġ= Ġget Iss ued Capture Config () ĊĠĠĠĠĠĠĠ ĠassertThat ( capture Config . template Type ). isEqualTo ( Camera Device . TEMPLATE _ VIDEO _ SNAPSHOT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Af Trigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Iss ued Capture Config (). to Camera 2 Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ TRIGGER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ TRIGGER _ START ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Cancel Af Trigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Iss ued Capture Config (). to Camera 2 Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ TRIGGER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ TRIGGER _ CANCEL ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Ae Pre capture Trigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Iss ued Capture Config (). to Camera 2 Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER _ START ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Cancel Ae Pre capture Trigger () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Iss ued Capture Config (). to Camera 2 Config (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ PRE CAPTURE _ TRIGGER _ CANCEL ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Torch Enable () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera 2 Config Ġ= Ġget Iss ued Session Config (). to Camera 2 Config () ĊĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera 2 Config , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON , ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera 2 Config , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . FLASH _ MODE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Metadata . FLASH _ MODE _ TOR CH , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Torch Disable () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera 2 Config Ġ= Ġget Iss ued Capture Config (). to Camera 2 Config () ĊĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera 2 Config , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera 2 Config , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . FLASH _ MODE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . FLASH _ MODE _ OFF ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Iss ued Capture Config (): ĠCapture Config Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Captor . for Class ( List :: class . java ) Ġas ĠArgument Captor < List < Capture Config >> ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback ). on Camera Control Capture Requests ( capt or . capture ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġcapt or . value [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Iss ued Session Config (): ĠSession Config Ġ{ ĊĠĠĠĠĠĠĠ Ġverify ( control Update Callback ). on Camera Control Update Session Config () ĊĠĠĠĠĠĠĠ Ġreturn Ġcamera Control . session Config ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġassert Camera 2 Config Value ( ĊĠĠĠĠĠĠĠ Ġcamera 2 Config : ĠCamera 2 Impl Config , ĊĠĠĠĠĠĠĠ Ġkey : ĠCapture Request . Key < T >, ĊĠĠĠĠĠĠĠ Ġexpected Value : ĠT , ĊĠĠĠĠĠĠĠ Ġassert Msg : ĠString Ġ= Ġ"" ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġassert With Message ( assert Msg ). that ( camera 2 Config . get Capture Request Option ( key , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo ( expected Value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Camera Control ( ĊĠĠĠĠĠĠĠ Ġcamera Id : ĠString Ġ= ĠCAM ERA _ ID _ 0 , ĊĠĠĠĠĠĠĠ Ġqu ir ks : ĠQu ir ks ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Manager Ġ= Ġcontext . getSystem Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristics Ġ= Ġcamera Manager . get Camera Character istics ( camera Id ) ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristics Compat Ġ= ĠCamera Character istics Compat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Camera Character istics Compat ( character istics ) ĊĠĠĠĠĠĠĠ Ġval Ġcamera Qu irk Ġ= Ġqu ir ks Ġ?: ĠCamera Qu ir ks . get ( camera Id , Ġcharacteristics Compat ) ĊĠĠĠĠĠĠĠ Ġval ĠexecutorService Ġ= ĠCamera X Executors . new Handler Executor ( handler ) ĊĊĠĠĠĠĠĠĠ Ġcamera Control Ġ= ĠCamera 2 Camera Control Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacteristics Compat , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠexecutorService , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol Update Callback , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Qu irk ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Active ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincrement Use Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Cam eras () Ġ{ ĊĠĠĠĠĠĠĠ ĠShadow . extract < Shadow Camera Manager >( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getSystem Service ( Context . CAMERA _ SERVICE ) ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Camera ( CAMERA _ ID _ 0 , Ġint i Characteristic 0 ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġint i Characteristic 0 (): ĠCamera Character istics Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠShadow Camera Character istics . new Camera Character istics (). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠShadow . extract < Shadow Camera Character istics >( it ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( Camera Character istics . FLASH _ INFO _ AVAILABLE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Character istics . CONTROL _ AE _ AVAILABLE _ MODES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġint ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ OFF , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON _ AUTO _ FLASH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON _ ALWAYS _ FLASH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON _ AUTO _ FLASH _ RE DE YE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AE _ MODE _ ON _ EXTERNAL _ FLASH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Character istics . LEN S _ F ACING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Metadata . LEN S _ F ACING _ BACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠCapture Config . to Camera 2 Config () Ġ= ĠCamera 2 Impl Config ( implementation Options ) Ċ Ċ private Ġfun ĠSession Config . to Camera 2 Config () Ġ= ĠCamera 2 Impl Config ( implementation Options ) Ċ