package Ġcom . playground . firebase . ml . playground Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics .* Ċ import Ġandroid . hardware . camera 2 .* Ċ import Ġandroid . media . Image Reader Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . support . annotation . Requires Api Ċ import Ġandroid . support . v 4 . app . Activity Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Size Ċ import Ġandroid . util . S parseInt Array Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Texture View Ċ import Ġcom . google . firebase . ml . vision . Firebase Vision Ċ import Ġcom . google . firebase . ml . vision . common . Firebase Vision Image Ċ import Ġcom . google . firebase . ml . vision . common . Firebase Vision Image Metadata Ċ import Ġcom . google . firebase . ml . vision . face . Firebase Vision Face Detector Ċ import Ġcom . google . firebase . ml . vision . face . Firebase Vision Face Detector Options Ċ import Ġkotlinx . android . synt hetic . main . camera _ layout .* Ċ import Ġtim ber . log . Tim ber ĊĊ Ċ class ĠCamera Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCAM ERA _ PERMISSION _ REQUEST _ CODE Ġ= Ġ 2 1 4 3 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠOR IENT ATIONS Ġ= ĠS parseInt Array () ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOR IENT ATIONS . append ( Surface . ROT ATION _ 0 , Ġ 9 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOR IENT ATIONS . append ( Surface . ROT ATION _ 9 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOR IENT ATIONS . append ( Surface . ROT ATION _ 1 8 0 , Ġ 2 7 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOR IENT ATIONS . append ( Surface . ROT ATION _ 2 7 0 , Ġ 1 8 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcamera : ĠCamera Device ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbackground Handler : ĠHandler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbackground Thread : ĠHandler Thread ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġimage Dimension : ĠSize ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcapture RequestBuilder : ĠCapture Request . Builder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġsession : ĠCamera Capture Session ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcamera Id : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġimage Reader : ĠImage Reader ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdetector : ĠFirebase Vision Face Detector ĊĠĠĠ Ġprivate Ġvar Ġcapture InProgress : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmanager : ĠCamera Manager ĊĊĠĠĠ Ġprivate Ġval Ġtexture Listener Ġ= Ġobject : ĠTexture View . Surface Texture Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Size Changed ( surface : ĠSurface Texture ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransform Ġyou Ġimage Ġcaptured Ġsize Ġaccording Ġto Ġthe Ġsurface Ġwidth Ġand Ġheight ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Updated ( surface : ĠSurface Texture ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Destroyed ( surface : ĠSurface Texture ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Available ( surface : ĠSurface Texture ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" on Surface Texture Available ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstate Callback Ġ= Ġobject : ĠCamera Device . State Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Opened ( camera : ĠCamera Device ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Opened ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Camera Activity . camera Ġ= Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Camera Preview () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Disconnected ( camera : ĠCamera Device ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Camera Activity . camera ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( camera : ĠCamera Device ?, Ġerror : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Camera Activity . camera ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Camera Activity . camera Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . camera _ layout ) ĊĠĠĠĠĠĠĠ Ġtexture . surface Texture Listener Ġ= Ġtexture Listener ĊĠĠĠĠĠĠĠ Ġdrawing . is Opaque Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġdrawing . alpha Ġ= Ġ 0 . 5 f ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠFirebase Vision Face Detector Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Land mark Mode ( Firebase Vision Face Detector Options . ALL _ LAND MARK S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Classification Mode ( Firebase Vision Face Detector Options . ALL _ CLAS SIF ICATION S ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Min Face Size ( 0 . 1 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. enable Tracking () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġdetector Ġ= ĠFirebase Vision . getInstance (). get Vision Face Detector ( options ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Background Thread () Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Thread Ġ= ĠHandler Thread (" Camera ĠBackground ") ĊĠĠĠĠĠĠĠ Ġbackground Thread ?. start () ĊĠĠĠĠĠĠĠ Ġbackground Handler Ġ= ĠHandler ( background Thread ?. lo oper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Background Thread () Ġ{ ĊĠĠĠĠĠĠĠ Ġbackground Thread ?. quit S af ely () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Thread ?. join () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Thread Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Handler Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Camera Preview () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Texture Ġ= Ġtexture . surface Texture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Texture . setDefault BufferSize ( image Dimension !!. width , Ġimage Dimension !!. height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsurface Ġ= ĠSurface ( surface Texture ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Thread Ġ= ĠHandler Thread (" image Handler ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandler Thread . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Reader Ġ= ĠImage Reader . newInstance ( 1 4 4 0 , Ġ 2 1 1 2 , ĠImage Format . Y UV _ 4 2 0 _ 8 8 8 , Ġ 3 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Reader ?. setOn Image Available Listener ( fun ( reader : ĠImage Reader ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Image Reader Ġready ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Ġ= Ġreader . acquire Latest Image () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Image ĠSize : Ġ${ image . width }, Ġ${ image . height }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Size Ġ= ĠSize ( image . width , Ġimage . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! capture InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Image Ġprocess Ġstart ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture InProgress Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirebase Image Ġ= ĠFirebase Vision Image . from Media Image ( image , Ġget Rotation Comp ensation ( this @ Camera Activity , Ġmanager , Ġcamera Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . detect In Image ( firebase Image ). add On Success Listener Ġ{ Ġface List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" face Ġdetected : Ġ${ face List . size }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( face List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġface List . forEach Ġ{ Ġface Vision Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Bounding Ġbox : Ġ${ face Vision . bounding Box }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Rect ( face Vision . bounding Box , Ġimage Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġclear Ġcanvas ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( capture InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. add On Failure Listener Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( exception , Ġ" Exception ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( capture InProgress ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture InProgress Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠHandler ( handler Thread . lo oper )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture RequestBuilder Ġ= Ġcamera ?. create Capture Request ( Camera Device . TEMPLATE _ PRE VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture RequestBuilder ?. add Target ( surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture RequestBuilder ?. add Target ( image Reader ?. surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. create Capture Session ( listOf ( surface , Ġimage Reader ?. surface ), Ġobject : ĠCamera Capture Session . State Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configure Failed ( session : ĠCamera Capture Session ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Configuration Ġchange ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configured ( session : ĠCamera Capture Session ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" on Configured ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġcamera Ġis Ġalready Ġclosed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( camera Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġsession Ġis Ġready , Ġwe Ġstart Ġdisplaying Ġthe Ġpreview . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Camera Activity . session Ġ= Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġbackground Handler ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Rect ( rect : ĠRect , Ġimage Size : ĠSize ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanvas Ġ= Ġdrawing . lock Canvas () ĊĠĠĠĠĠĠĠ Ġcanvas ?. let { Ġcanvas Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Canvas Ġwidth : Ġ${ canvas . width } Ġand Ġheight : Ġ${ canvas . height }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Correction Ġ= Ġcanvas . width Ġ/ Ġimage Size . width . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Correction Ġ= Ġcanvas . height Ġ/ Ġimage Size . height . toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" Corre ctions : Ġ$ width Correction , Ġ$ height Correction ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixed Rect Ġ= ĠRect (( rect . left Ġ* Ġwidth Correction ). toInt (), Ġ( rect . top Ġ* Ġheight Correction ). toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( rect . right Ġ* Ġwidth Correction ). toInt (), Ġ( rect . bottom Ġ* Ġheight Correction ). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" fixed ĠRect : Ġ$ fixed Rect ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( fixed Rect , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawing . unlock Canvas And Post ( canvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// val Ġmanager Ġ= Ġget System Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Camera Ġis Ġopening ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Id Ġ= Ġmanager . camera IdList [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manager . camera IdList . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Id Ġ= Ġmanager . camera IdList [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcharacteristics Ġ= Ġmanager . get Camera Character istics ( camera Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġcharacteristics . get ( Camera Character istics . SCAL ER _ STREAM _ CONFIGURATION _ MAP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Dimension Ġ= Ġmap . getOutput Sizes ( Surface Texture :: class . java )[ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( this , ĠManifest . permission . CAMERA ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . CAMERA , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ), ĠCAM ERA _ PERMISSION _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . open Camera ( camera Id , Ġstate Callback , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Preview () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" update ĠPreview ") ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" update Preview Ġerror , Ġreturn ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcapture RequestBuilder ?. set ( Capture Request . CONTROL _ MODE , ĠCamera Metadata . CONTROL _ MODE _ AUTO ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession ?. set Repe ating Request ( capture RequestBuilder ?. build (), Ġnull , Ġbackground Handler ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclose Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image Reader Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Reader ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Reader Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠCAM ERA _ PERMISSION _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ DEN IED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Resume ") ĊĠĠĠĠĠĠĠ Ġmanager Ġ= Ġget System Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠĠĠĠĠ Ġstart Background Thread () ĊĠĠĠĠĠĠĠ Ġif Ġ( texture . is Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Camera () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtexture . surface Texture Listener Ġ= Ġtexture Listener ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ ĠTim ber . d (" on Pause ") ĊĠĠĠĠĠĠĠ Ġstop Background Thread () ĊĠĠĠĠĠĠĠ Ġclose Camera () ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( api Ġ= ĠBuild . VERSION _ CODES . LO L LI POP ) ĊĠĠĠ Ġ@ Throws ( Camera AccessException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġget Rotation Comp ensation ( activity : ĠActivity , Ġcamera Manager : ĠCamera Manager , Ġcamera Id : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġdevice 's Ġcurrent Ġrotation Ġrelative Ġto Ġits Ġ" native " Ġorientation . ĊĠĠĠĠĠĠĠ Ġ// ĠThen , Ġfrom Ġthe ĠOR IENT ATIONS Ġtable , Ġlook Ġup Ġthe Ġangle Ġthe Ġimage Ġmust Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġrotated Ġto Ġcomp ens ate Ġfor Ġthe Ġdevice 's Ġrotation . ĊĠĠĠĠĠĠĠ Ġval Ġdevice Rotation Ġ= Ġactivity . window Manager . default Display . rotation ĊĠĠĠĠĠĠĠ Ġvar Ġrotation Comp ensation Ġ= ĠOR IENT ATIONS . get ( device Rotation ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOn Ġmost Ġdevices , Ġthe Ġsensor Ġorientation Ġis Ġ 9 0 Ġdegrees , Ġbut Ġfor Ġsome ĊĠĠĠĠĠĠĠ Ġ// Ġdevices Ġit Ġis Ġ 2 7 0 Ġdegrees . ĠFor Ġdevices Ġwith Ġa Ġsensor Ġorientation Ġof ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 7 0 , Ġrotate Ġthe Ġimage Ġan Ġadditional Ġ 1 8 0 Ġ(( 2 7 0 Ġ+ Ġ 2 7 0 ) Ġ% Ġ 3 6 0 ) Ġdegrees . ĊĠĠĠĠĠĠĠ Ġval Ġsensor Orientation Ġ= Ġcamera Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Camera Character istics ( camera Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get ( Camera Character istics . SENSOR _ OR IENTATION ) !! ĊĠĠĠĠĠĠĠ Ġrotation Comp ensation Ġ= Ġ( rotation Comp ensation Ġ+ Ġsensor Orientation Ġ+ Ġ 2 7 0 ) Ġ% Ġ 3 6 0 ĊĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġthe Ġcorresponding ĠFirebase Vision Image Metadata Ġrotation Ġvalue . ĊĠĠĠĠĠĠĠ Ġval Ġresult : ĠInt ĊĠĠĠĠĠĠĠ Ġwhen Ġ( rotation Comp ensation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġresult Ġ= ĠFirebase Vision Image Metadata . ROT ATION _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 9 0 Ġ-> Ġresult Ġ= ĠFirebase Vision Image Metadata . ROT ATION _ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 8 0 Ġ-> Ġresult Ġ= ĠFirebase Vision Image Metadata . ROT ATION _ 1 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 7 0 Ġ-> Ġresult Ġ= ĠFirebase Vision Image Metadata . ROT ATION _ 2 7 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠFirebase Vision Image Metadata . ROT ATION _ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e (" Bad Ġrotation Ġvalue : Ġ$ rotation Comp ensation ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTim ber . d (" Rotation : Ġ$ result ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }