/* Ċ Ġ* Ġ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 . core Ċ Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . util . Size Ċ import Ġandroid . view . Surface Ċ import Ġandroidx . camera . core . impl . Def err able Surface Ċ import Ġandroidx . camera . core . impl . utils . executor . Camera X Executors Ċ import Ġandroidx . camera . testing . G arbage Collection Util Ċ import Ġandroidx . camera . testing . f akes . Fake Camera Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . util . Consumer Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġandroidx . test . filters . Large Test Ċ import Ġandroidx . test . filters . Sdk Suppress Ċ import Ġandroidx . test . filters . Small Test Ċ import Ġcom . google . common . truth . Truth Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Matchers Ċ import Ġorg . mockito . Mockito Ċ import Ġjava . lang . ref . Ph antom Reference Ċ import Ġjava . lang . ref . Reference Queue Ċ import Ġjava . util . concurrent . TimeoutException Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ @ Small Test Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Sdk Suppress ( min Sdk Version Ġ= Ġ 2 1 ) Ċ class ĠSurface Request Test Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsurface Requests : ĠMutable List < Surface Request > Ġ= ĠArrayList () ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġall Ġrequests Ġcomplete ĊĠĠĠĠĠĠĠ Ġfor Ġ( request Ġin Ġsurface Requests ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClosing Ġthe Ġdef err able Ġsurface Ġshould Ġcause Ġthe Ġrequest Ġto Ġbe Ġcancelled Ġif Ġit Ġhas ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġyet Ġbeen Ġcompleted . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Retrieve Resolution () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolution Ġ= ĠSize ( 6 4 0 , Ġ 4 8 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( resolution ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( request . resolution ). isEqualTo ( resolution ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġset Will Not Provide Surface _ results In W ILL _ NOT _ PRO VID E _ SURFACE () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠConsumer < Surface Request . Result > Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsumer :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠConsumer < Surface Request . Result > ĊĠĠĠĠĠĠĠ Ġrequest . will Not Provide Surface () ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( MOCK _ SURFACE , ĠCamera X Executors . direct Executor (), Ġlistener ) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener ). accept ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . eq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . RESULT _ W ILL _ NOT _ PRO VID E _ SURFACE , ĠMOCK _ SURFACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwill Not Provide Surface _ returns False _ when Already Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠComplete Ġthe Ġrequest ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMOCK _ SURFACE , ĠCamera X Executors . direct Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNO _ OP _ RESULT _ LIST ENER ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( request . will Not Provide Surface ()). isFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwill Not Provide Surface _ returns False _ when Request Is Cancelled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġrequest Ġto Ġbe Ġcancelled Ġfrom Ġproducer Ġside ĊĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( request . will Not Provide Surface ()). isFalse () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġwill Not Provide Surface _ returns True _ when Not Y et Completed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( request . will Not Provide Surface ()). isTrue () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġsurface Request Result _ comp letes Successfully _ after Producer Is Done () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠConsumer < Surface Request . Result > Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsumer :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠConsumer < Surface Request . Result > ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMOCK _ SURFACE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( Application Provider . getApplicationContext ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġrequest Ġto Ġbe Ġcompleted Ġfrom Ġproducer Ġside ĊĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener , ĠMockito . timeout ( 5 0 0 )). accept ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . eq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . RESULT _ SURFACE _ USED _ SUCCESS FULL Y , ĠMOCK _ SURFACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġprovide Surface _ results In SURFACE _ AL READY _ PROVIDED _ on Second Invocation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠConsumer < Surface Request . Result > Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsumer :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠConsumer < Surface Request . Result > ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMOCK _ SURFACE , ĠCamera X Executors . direct Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNO _ OP _ RESULT _ LIST ENER ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( MOCK _ SURFACE , ĠCamera X Executors . direct Executor (), Ġlistener ) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener ). accept ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . eq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . RESULT _ SURFACE _ AL READY _ PROVIDED , ĠMOCK _ SURFACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġcancelled Request _ results In REQUEST _ CANCEL LED () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġrequest Ġto Ġbe Ġcancelled Ġfrom Ġproducer Ġside ĊĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ Ġval Ġlistener : ĠConsumer < Surface Request . Result > Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConsumer :: class . java ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠConsumer < Surface Request . Result > ĊĠĠĠĠĠĠĠ Ġrequest . provide Surface ( MOCK _ SURFACE , ĠCamera X Executors . direct Executor (), Ġlistener ) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener ). accept ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArgument Matchers . eq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Result . RESULT _ REQUEST _ CANCEL LED , ĠMOCK _ SURFACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancelled Request _ calls Cancellation Listener _ when Cancelled After Adding Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠMockito . mock ( Runnable :: class . java ) ĊĠĠĠĠĠĠĠ Ġrequest . add Request Cancellation Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( Application Provider . getApplicationContext ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġrequest Ġto Ġbe Ġcancelled Ġfrom Ġproducer Ġside ĊĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener , ĠMockito . timeout ( 5 0 0 )). run () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcancelled Request _ calls Cancellation Listener _ when Cancelled Before Adding Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCause Ġrequest Ġto Ġbe Ġcancelled Ġfrom Ġproducer Ġside ĊĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠMockito . mock ( Runnable :: class . java ) ĊĠĠĠĠĠĠĠ Ġrequest . add Request Cancellation Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( Application Provider . getApplicationContext ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠMockito . verify ( listener , ĠMockito . timeout ( 5 0 0 )). run () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Listener When Transformation Available _ re ceiv es Immediate ly () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġrequest . update Transformation Info ( FA KE _ INFO ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Reference Ġ= ĠAtomic Reference < Surface Request . Transformation Info >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġrequest . set Transformation Info Listener ( Camera X Executors . direct Executor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue : ĠSurface Request . Transformation Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Reference . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( info Reference . get ()). isEqualTo ( FA KE _ INFO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Listener _ re ceiv es Callback When Available () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Reference Ġ= ĠAtomic Reference < Surface Request . Transformation Info >() ĊĠĠĠĠĠĠĠ Ġrequest . set Transformation Info Listener ( Camera X Executors . direct Executor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue : ĠSurface Request . Transformation Info Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Reference . set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( info Reference . get ()). isNull () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠ Ġrequest . update Transformation Info ( FA KE _ INFO ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠ ĠTr uth . assertThat ( info Reference . get ()). isEqualTo ( FA KE _ INFO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġrequest Ġassigned Ġto Ġnull Ġto Ġmake ĠGC Ġel igible ĊĠĠĠ Ġ@ Large Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( TimeoutException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġdef err able Surface _ strong ly References Surface Request () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġvar Ġrequest : ĠSurface Request ? Ġ= Ġcreate NewRequest Without Auto Cleanup ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġthe ĠDef err able Surface Ġwhich Ġshould Ġmaintain Ġthe Ġstrong Ġreference Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// ĠSurface Request ĊĠĠĠĠĠĠĠ Ġval Ġdef err able Surface Ġ= Ġrequest !!. def err able Surface ĊĠĠĠĠĠĠĠ Ġval Ġreference Queue Ġ= ĠReference Queue < Surface Request ?> () ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġsurface Ġrequest Ġgarbage Ġcollection Ġis Ġtracked ĊĠĠĠĠĠĠĠ Ġval Ġph antom Reference Ġ= ĠPh antom Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Queue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNull Ġout Ġthe Ġoriginal Ġreference Ġto Ġthe ĠSurface Request . ĠDef err able Surface Ġshould Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġonly Ġreference Ġremaining . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull . also Ġ{ Ġrequest Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG arbage Collection Util . run Final ization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Final ized Ġ= Ġreference Queue . poll () Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( request Final ized ). isFalse () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClean Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġph antom Reference . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef err able Surface . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdef err able Surface Ġassigned Ġto Ġnull Ġto Ġmake ĠGC Ġel igible ĊĠĠĠ Ġ@ Large Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( TimeoutException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġsurface Request _ strong ly References Def err able Surface () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠArrange . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġcreate NewRequest Without Auto Cleanup ( FA KE _ SIZE ) ĊĠĠĠĠĠĠĠ Ġ// ĠRetrieve Ġthe ĠDef err able Surface Ġwhich Ġshould Ġmaintain Ġthe Ġstrong Ġreference Ġto Ġthe ĊĠĠĠĠĠĠĠ Ġ// ĠSurface Request ĊĠĠĠĠĠĠĠ Ġvar Ġdef err able Surface : ĠDef err able Surface ? Ġ= Ġrequest . def err able Surface ĊĠĠĠĠĠĠĠ Ġval Ġreference Queue Ġ= ĠReference Queue < Def err able Surface ?> () ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġsurface Ġrequest Ġgarbage Ġcollection Ġis Ġtracked ĊĠĠĠĠĠĠĠ Ġval Ġph antom Reference Ġ= ĠPh antom Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef err able Surface , Ġreference Queue ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAct . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNull Ġout Ġthe Ġoriginal Ġreference Ġto Ġthe ĠDef err able Surface . ĠSurface Request Ġshould Ġbe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġonly Ġreference Ġremaining . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull . also Ġ{ Ġdef err able Surface Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠG arbage Collection Util . run Final ization () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdef err able Surface Final ized Ġ= Ġreference Queue . poll () Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAssert . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTr uth . assertThat ( def err able Surface Final ized ). isFalse () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClean Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġph antom Reference . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . def err able Surface . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThe Ġtest Ġmethod Ġis Ġresponsible Ġfor Ġensuring Ġthat Ġthe ĠSurface Request Ġis Ġfinished . ĊĠĠĠ Ġprivate Ġfun Ġcreate NewRequest Without Auto Cleanup ( size : ĠSize ): ĠSurface Request Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate NewRequest ( size , Ġauto Cleanup Ġ= Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate NewRequest ( ĊĠĠĠĠĠĠĠ Ġsize : ĠSize , ĊĠĠĠĠĠĠĠ Ġauto Cleanup : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠSurface Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠSurface Request ( size , ĠFake Camera (), Ġfalse ) ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Cleanup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Requests . add ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFA KE _ SIZE : ĠSize Ġby Ġlazy Ġ{ ĠSize ( 0 , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFA KE _ INFO : ĠSurface Request . Transformation Info Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface Request . Transformation Info . of ( Rect (), Ġ 0 , ĠSurface . ROT ATION _ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNO _ OP _ RESULT _ LIST ENER Ġ= ĠConsumer Ġ{ Ġ_: ĠSurface Request . Result ? Ġ-> Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMOCK _ SURFACE Ġ= ĠMockito . mock ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSurface :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }