/* Ċ Ġ* Ġ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 . video Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . util . Size Ċ import Ġandroid . view . Surface Ċ import Ġandroidx . camera . core . Camera Selector Ċ import Ġandroidx . camera . core . Camera X Ċ import Ġandroidx . camera . core . Camera X Config Ċ import Ġandroidx . camera . core . Surface Request Ċ import Ġandroidx . camera . core . impl . Camera Factory Ċ import Ġandroidx . camera . core . impl . Image Output Config Ċ import Ġandroidx . camera . core . impl . Mutable State Observable Ċ import Ġandroidx . camera . core . impl . Observable Ċ import Ġandroidx . camera . core . impl . utils . executor . Camera X Executors Ċ import Ġandroidx . camera . core . internal . Camera UseCase Adapter Ċ import Ġandroidx . camera . testing . Cam c order Profile Util Ċ import Ġandroidx . camera . testing . Cam c order Profile Util . PROFILE _ 2 1 6 0 P Ċ import Ġandroidx . camera . testing . Cam c order Profile Util . PROFILE _ 7 2 0 P Ċ import Ġandroidx . camera . testing . Cam c order Profile Util . RESOL UTION _ 2 1 6 0 P Ċ import Ġandroidx . camera . testing . Camera Util Ċ import Ġandroidx . camera . testing . f akes . Fake AppConfig Ċ import Ġandroidx . camera . testing . f akes . Fake Cam c order Profile Provider Ċ import Ġandroidx . camera . testing . f akes . Fake Camera Ċ import Ġandroidx . camera . testing . f akes . Fake Camera Factory Ċ import Ġandroidx . camera . testing . f akes . Fake Camera Info Internal Ċ import Ġandroidx . camera . video . Quality Selector . QUAL ITY _ F HD Ċ import Ġandroidx . camera . video . Quality Selector . QUAL ITY _ U HD Ċ import Ġandroidx . camera . video . Video Output . Stream State Ċ import Ġandroidx . core . util . Consumer Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assert Throws Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Mockito . any Ċ import Ġorg . mockito . Mockito . mock Ċ 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 Ċ Ċ private Ġval ĠANY _ SIZE Ġ= ĠSize ( 6 4 0 , Ġ 4 8 0 ) Ċ private Ġconst Ġval ĠCAM ERA _ ID _ 0 Ġ= Ġ" 0 " Ċ private Ġconst Ġval ĠCAM ERA _ ID _ 1 Ġ= Ġ" 1 " Ċ private Ġval ĠCAM ERA _ 0 _ PROFILE _ HIGH Ġ= ĠCam c order Profile Util . as High Quality ( PROFILE _ 2 1 6 0 P ) Ċ private Ġval ĠCAM ERA _ 0 _ PROFILE _ LOW Ġ= ĠCam c order Profile Util . as Low Quality ( PROFILE _ 7 2 0 P ) Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ DoNot Instrument Ċ @ Config ( min Sdk Ġ= ĠBuild . VERSION _ CODES . LO L LI POP ) Ċ class ĠVideo Capture Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcontext : ĠContext Ġ= ĠApplication Provider . getApplicationContext () ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera UseCase Adapter 0 : ĠCamera UseCase Adapter ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera UseCase Adapter 1 : ĠCamera UseCase Adapter ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġcamera 0 ĊĠĠĠĠĠĠĠ Ġ// ĠCamera Ġ 0 Ġsupport Ġ 2 1 6 0 P ( U HD ) Ġand Ġ 7 2 0 P ( HD ) ĊĠĠĠĠĠĠĠ Ġval Ġcamera Info 0 Ġ= ĠFake Camera Info Internal ( CAMERA _ ID _ 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcam c order Profile Provider Ġ= ĠFake Cam c order Profile Provider . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Profile ( CAMERA _ 0 _ PROFILE _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Profile ( PROFILE _ 2 1 6 0 P ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Profile ( PROFILE _ 7 2 0 P ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Profile ( CAMERA _ 0 _ PROFILE _ LOW ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcamera 0 Ġ= ĠFake Camera ( CAMERA _ ID _ 0 , Ġnull , Ġcamera Info 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġcamera Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Ġcamera 1 Ġhas Ġno Ġsupported Ġquality ĊĠĠĠĠĠĠĠ Ġval Ġcamera Info 1 Ġ= ĠFake Camera Info Internal ( CAMERA _ ID _ 1 , Ġ 0 , ĠCamera Selector . LEN S _ F ACING _ FRONT ) ĊĠĠĠĠĠĠĠ Ġval Ġcamera 1 Ġ= ĠFake Camera ( CAMERA _ ID _ 1 , Ġnull , Ġcamera Info 1 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcamera Factory Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Factory . Provider Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFake Camera Factory (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Default Back Camera ( CAMERA _ ID _ 0 ) Ġ{ Ġcamera 0 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Default Front Camera ( CAMERA _ ID _ 1 ) Ġ{ Ġcamera 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcamera X Config Ġ= ĠCamera X Config . Builder . from Config ( Fake AppConfig . create ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Camera Factory Provider ( camera Factory Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ ĠCamera X . initialize ( context , Ġcamera X Config ). get () ĊĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Util . create Camera UseCase Adapter ( context , ĠCamera Selector . DEFAULT _ BACK _ CAMERA ) ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Util . create Camera UseCase Adapter ( context , ĠCamera Selector . DEFAULT _ FRONT _ CAMERA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: camera UseCase Adapter 0 . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Use Cases ( use Cases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: camera UseCase Adapter 1 . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 1 . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Use Cases ( use Cases ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠCamera X . shutdown (). get () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Target Resolution _ throws Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output () ĊĊĠĠĠĠĠĠĠ ĠassertThrows ( Unsupported OperationException :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Resolution ( ANY _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Get Video Output () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . with Output ( video Output ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( video Capture . output ). isEqualTo ( video Output ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġadd Use Cases _ receive On Surface Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġvar Ġsurface Request : ĠSurface Request ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( surface RequestListener Ġ= Ġ{ Ġsurface Request Ġ= Ġit Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( surface Request ). isNotNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġadd Use Cases _ with Null Media Spec _ throw Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( media Spec Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThrows ( Camera UseCase Adapter . Camera Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Quality Selector _ same Resolution As Quality Selector () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġ// ĠCamera Ġ 0 Ġsupport Ġ 2 1 6 0 P ( U HD ) Ġand Ġ 7 2 0 P ( HD ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Spec Ġ= ĠMedia Spec . builder (). configure Video Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Quality Selector ( Quality Selector . of ( QUAL ITY _ U HD )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġval Ġtarget Resolution Ġ= Ġvideo Capture . current Config . retrieve Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Output Config . OPTION _ TARGET _ RESOL UTION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( target Resolution ). isEqualTo ( RESOL UTION _ 2 1 6 0 P ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Quality Selector _ not Supported Quality _ throw Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġ// ĠCamera Ġ 0 Ġsupport Ġ 2 1 6 0 P ( U HD ) Ġand Ġ 7 2 0 P ( HD ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Spec Ġ= ĠMedia Spec . builder (). configure Video Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Quality Selector ( Quality Selector . of ( QUAL ITY _ F HD )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThrows ( Camera UseCase Adapter . Camera Exception :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġno Supported Quality _ use Default Resolution () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Spec Ġ= ĠMedia Spec . builder (). configure Video Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Quality Selector ( Quality Selector . of ( QUAL ITY _ U HD )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġ// Ġcamera 1 Ġhas Ġno Ġsupported Ġquality ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 1 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġval Ġtarget Resolution Ġ= Ġvideo Capture . current Config . retrieve Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImage Output Config . OPTION _ TARGET _ RESOL UTION ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertThat ( target Resolution ). isEqualTo ( Video Capture . Defaults . DEFAULT _ RESOL UTION ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġremove Use Cases _ receive Result Of Surface Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġvar Ġsurface Result : ĠSurface Request . Result ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output Ġ{ Ġsurface Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Request . provide Surface ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmock ( Surface :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . direct Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġsurface Result Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġ// ĠSurface Ġis Ġin Ġuse , Ġshould Ġnot Ġreceive Ġany Ġresult . ĊĠĠĠĠĠĠĠ ĠassertThat ( surface Result ). isNull () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . remove Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( surface Result !!. result Code ). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . RESULT _ SURFACE _ USED _ SUCCESS FULL Y ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Target Rotation _ rotation Is Changed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . with Output ( create Video Output ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġvideo Capture . target Rotation Ġ= ĠSurface . ROT ATION _ 1 8 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( video Capture . target Rotation ). isEqualTo ( Surface . ROT ATION _ 1 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġadd Use Cases _ transformation Info Updated () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġmock ( Surface Request . Transformation Info Listener :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface RequestListener Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Transformation Info Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . direct Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ Ġverify ( listener ). on Transformation Info Update ( any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Target Rotation _ transformation Info Updated () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġvar Ġtransformation Info : ĠSurface Request . Transformation Info ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġvideo Output Ġ= Ġcreate Video Output ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface RequestListener Ġ= Ġ{ Ġsurface Request Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Request . set Transformation Info Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . direct Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformation Info Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġvideo Capture Ġ= ĠVideo Capture . Builder ( video Output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( Surface . ROT ATION _ 9 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Session Option Un packer Ġ{ Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġcamera UseCase Adapter 0 . add Use Cases ( listOf ( video Capture )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( transformation Info !!. target Rotation ). isEqualTo ( Surface . ROT ATION _ 9 0 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġvideo Capture . target Rotation Ġ= ĠSurface . ROT ATION _ 1 8 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠassertThat ( transformation Info !!. target Rotation ). isEqualTo ( Surface . ROT ATION _ 1 8 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Video Output ( ĊĠĠĠĠĠĠĠ Ġstream State : ĠStream State Ġ= ĠStream State . ACTIVE , ĊĠĠĠĠĠĠĠ Ġmedia Spec : ĠMedia Spec ? Ġ= ĠMedia Spec . builder (). build (), ĊĠĠĠĠĠĠĠ Ġsurface RequestListener : ĠConsumer < Surface Request > Ġ= ĠConsumer Ġ{ Ġit . will Not Provide Surface () Ġ} ĊĠĠĠ Ġ): ĠTest Video Output Ġ= ĠTest Video Output ( stream State , Ġmedia Spec , Ġsurface RequestListener ) ĊĊĠĠĠ Ġprivate Ġclass ĠTest Video Output Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġstream State : ĠStream State , ĊĠĠĠĠĠĠĠ Ġmedia Spec : ĠMedia Spec ?, ĊĠĠĠĠĠĠĠ Ġval Ġsurface Request Callback : ĠConsumer < Surface Request > ĊĠĠĠ Ġ) Ġ: ĠVideo Output Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstream State Observable : ĠMutable State Observable < Stream State > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutable State Observable . with InitialState ( stream State ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmedia Spec Observable : ĠMutable State Observable < Media Spec > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMutable State Observable . with InitialState ( media Spec ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Requested ( surface Request : ĠSurface Request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Request Callback . accept ( surface Request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Stream State (): ĠObservable < Stream State > Ġ= Ġstream State Observable ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Media Spec (): ĠObservable < Media Spec > Ġ= Ġmedia Spec Observable ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Stream State ( stream State : ĠStream State ) Ġ= Ġstream State Observable . setState ( stream State ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġset Media Spec ( media Spec : ĠMedia Spec ) Ġ= Ġmedia Spec Observable . setState ( media Spec ) ĊĠĠĠ Ġ} Ċ } Ċ