package Ġru . yandex . mt . cam er af ocus Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . hardware . camera 2 .* Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . Surface View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġkotlinx . android . synt hetic . main . activity _ camera .* Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . suspend C ancellable Coroutine Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . coroutines . resume With Exception Ċ import Ġkotlin . coroutines . suspend Coroutine Ċ Ċ class ĠCamera 2 Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġ/** Ġ[ Handler Thread ] Ġwhere Ġall Ġcamera Ġoperations Ġrun Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcamera Thread Ġ= ĠHandler Thread (" Camera Thread "). apply Ġ{ Ġstart () Ġ} ĊĊĠĠĠ Ġ/** Ġ[ Handler ] Ġcorresponding Ġto Ġ[ camera Thread ] Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcamera Handler Ġ= ĠHandler ( camera Thread . lo oper ) ĊĊĠĠĠ Ġ/** ĠThe Ġ[ Camera Device ] Ġthat Ġwill Ġbe Ġopened Ġin Ġthis Ġfragment Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera : ĠCamera Device ĊĊĠĠĠ Ġ/** ĠInternal Ġreference Ġto Ġthe Ġongoing Ġ[ Camera Capture Session ] Ġconfigured Ġwith Ġour Ġparameters Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsession : ĠCamera Capture Session ĊĊĠĠĠ Ġ/** ĠDetect s , Ġcharacter izes , Ġand Ġconnects Ġto Ġa ĠCamera Device Ġ( used Ġfor Ġall Ġcamera Ġoperations ) Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcamera Manager : ĠCamera Manager Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Context . getSystem Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlateinit Ġvar Ġsurface Holder : ĠSurface Holder ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ camera ) ĊĠĠĠĠĠĠĠ Ġval Ġsurface Ġ= ĠSurface View ( this ) ĊĠĠĠĠĠĠĠ Ġcontainer . addView ( surface ) ĊĊĠĠĠĠĠĠĠ Ġsurface Holder Ġ= Ġsurface . holder ĊĠĠĠĠĠĠĠ Ġinitialize Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Camera () Ġ= Ġlifecycle Scope . launch ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOpen Ġthe Ġselected Ġcamera ĊĠĠĠĠĠĠĠ Ġval Ġcamera Id Ġ= Ġcamera Manager . camera IdList [ 0 ] ĊĠĠĠĠĠĠĠ Ġcamera Ġ= Ġopen Camera ( camera Manager , Ġcamera Id , Ġcamera Handler ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreates Ġlist Ġof ĠSur faces Ġwhere Ġthe Ġcamera Ġwill Ġoutput Ġframes ĊĠĠĠĠĠĠĠ Ġval Ġtargets Ġ= ĠlistOf ( surface Holder . surface ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStart Ġa Ġcapture Ġsession Ġusing Ġour Ġopen Ġcamera Ġand Ġlist Ġof ĠSur faces Ġwhere Ġframes Ġwill Ġgo ĊĠĠĠĠĠĠĠ Ġsession Ġ= Ġcreate Capture Session ( camera , Ġtargets , Ġcamera Handler ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapture Request Ġ= Ġcamera . create Capture Request ( Camera Device . TEMPLATE _ PRE VIEW ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Target ( surface Holder . surface ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġkeep Ġsending Ġthe Ġcapture Ġrequest Ġas Ġfrequently Ġas Ġpossible Ġuntil Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsession Ġis Ġt orn Ġdown Ġor Ġsession . stop Repe ating () Ġis Ġcalled ĊĠĠĠĠĠĠĠ Ġsession . set Repe ating Request ( capture Request . build (), Ġlistener , ĠHandler ( main Looper )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlistener Ġ= Ġobject Ġ: ĠCamera Capture Session . Capture Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Prog ressed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession : ĠCamera Capture Session , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠCapture Request , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpartial Result : ĠCapture Result ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġae Ġ= Ġpartial Result . get ( Capture Result . CONTROL _ AE _ STATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaf Ġ= Ġpartial Result . get ( Capture Result . CONTROL _ AF _ STATE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaw b Ġ= Ġpartial Result . get ( Capture Result . CONTROL _ AW B _ STATE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġae Stable Ġ= Ġ( ae Ġ== ĠCapture Result . CONTROL _ AE _ STATE _ CONVER GED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaf Stable Ġ= Ġ( af Ġin Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ PAS SIVE _ FOC USED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Result . CONTROL _ AF _ STATE _ FOC USED _ LOCK ED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaw b Stable Ġ= Ġ( aw b Ġ== ĠCapture Result . CONTROL _ AW B _ STATE _ CONVER GED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview _ ae . state Color ( ae Stable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview _ af . state Color ( af Stable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview _ aw b . state Color ( aw b Stable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġview _ f oc using . state Color ( ae Stable Ġ&& Ġaf Stable Ġ&& Ġaw b Stable ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" xk ty ", Ġ" ae Ġ$ ae Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" af Ġ$ af Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" aw b Ġ$ aw b " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġsession . stop Repe ating () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġopen Camera ( ĊĠĠĠĠĠĠĠ Ġmanager : ĠCamera Manager , ĊĠĠĠĠĠĠĠ Ġcamera Id : ĠString , ĊĠĠĠĠĠĠĠ Ġhandler : ĠHandler ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠCamera Device Ġ= Ġsuspend C ancellable Coroutine Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠ Ġmanager . open Camera ( camera Id , Ġobject Ġ: ĠCamera Device . State Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Opened ( device : ĠCamera Device ) Ġ= Ġcont . resume ( device ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Disconnected ( device : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" TAG ", Ġ" Camera Ġ$ camera Id Ġhas Ġbeen Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( device : ĠCamera Device , Ġerror : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ CAMERA _ DEVICE Ġ-> Ġ" Fatal Ġ( device )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ CAMERA _ DISABLED Ġ-> Ġ" Device Ġpolicy " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ CAMERA _ IN _ USE Ġ-> Ġ" Camera Ġin Ġuse " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ CAMERA _ SERVICE Ġ-> Ġ" Fatal Ġ( service )" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ MAX _ CAM ER AS _ IN _ USE Ġ-> Ġ" Maximum Ġcameras Ġin Ġuse " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" Unknown " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexc Ġ= ĠRuntimeException (" Camera Ġ$ camera Id Ġerror : Ġ($ error ) Ġ$ msg ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" TAG ", Ġexc . message , Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cont . isActive ) Ġcont . resume With Exception ( exc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġhandler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStarts Ġa Ġ[ Camera Capture Session ] Ġand Ġreturns Ġthe Ġconfigured Ġsession Ġ( as Ġthe Ġresult Ġof Ġthe ĊĠĠĠĠ Ġ* Ġsuspend Ġcoroutine ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġcreate Capture Session ( ĊĠĠĠĠĠĠĠ Ġdevice : ĠCamera Device , ĊĠĠĠĠĠĠĠ Ġtargets : ĠList < Surface >, ĊĠĠĠĠĠĠĠ Ġhandler : ĠHandler ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠCamera Capture Session Ġ= Ġsuspend Coroutine Ġ{ Ġcont Ġ-> ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcapture Ġsession Ġusing Ġthe Ġpredefined Ġtargets ; Ġthis Ġalso Ġinvolves Ġdefining Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġsession Ġstate Ġcallback Ġto Ġbe Ġnotified Ġof Ġwhen Ġthe Ġsession Ġis Ġready ĊĠĠĠĠĠĠĠ Ġdevice . create Capture Session ( targets , Ġobject Ġ: ĠCamera Capture Session . State Callback () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configured ( session : ĠCamera Capture Session ) Ġ= Ġcont . resume ( session ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configure Failed ( session : ĠCamera Capture Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexc Ġ= ĠRuntimeException (" Camera Ġ${ device . id } Ġsession Ġconfiguration Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" TAG ", Ġexc . message , Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume With Exception ( exc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġhandler ) ĊĠĠĠ Ġ} Ċ } Ċ