package Ġco . in fin um . example Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Surface Texture Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Scale Gesture Detector Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Texture View Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . camera . core . Camera Ċ import Ġandroidx . camera . core . Camera Info Unavailable Exception Ċ import Ġandroidx . camera . core . Camera Selector Ċ import Ġandroidx . camera . core . Camera X Ċ import Ġandroidx . camera . core . Focus Met ering Action Ċ import Ġandroidx . camera . core . Image Capture Ċ import Ġandroidx . camera . core . Image Capture Exception Ċ import Ġandroidx . camera . core . Image Proxy Ċ import Ġandroidx . camera . core . Met ering Point Factory Ċ import Ġandroidx . camera . core . Preview Ċ import Ġandroidx . camera . core . Surface Oriented Met ering Point Factory Ċ import Ġandroidx . camera . core . Video Capture Ċ import Ġandroidx . camera . core . impl . Video Capture Config Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . Executors Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . math . min Ċ Ċ @ Suppress Lint (" SetText I 1 8 n ", Ġ" Restricted Api ") Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Camera X Basic " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIL ENAME _ FORMAT Ġ= Ġ" yyyy - MM - dd - HH - mm - ss - SS S " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CODE _ PERMISSION S Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠarrayOf ( Manifest . permission . CAMERA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġconfigs : ĠCamera X Config Ġ= ĠCamera X Config () ĊĠĠĠ Ġprivate Ġvar Ġvideo Capture : ĠVideo Capture ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġimage Capture : ĠImage Capture ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcamera : ĠCamera ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġmain Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo File : ĠFile ĊĠĠĠ Ġprivate Ġvar Ġis Recording Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcamera Lens Selector Ġ= ĠCamera Selector . DEFAULT _ BACK _ CAMERA ĊĠĠĠ Ġprivate Ġvar Ġsettings Adapter Ġ= ĠSettings Adapter ( listOf ()) ĊĠĠĠ Ġprivate Ġvar Ġneed To Re create Camera Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġvideo File Ġ= ĠFile . create TempFile (" vid ", Ġ"") ĊĠĠĠĠĠĠĠ Ġinit Listeners () ĊĠĠĠĠĠĠĠ ĠsetUp Zoom And Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġsettings View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Items () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings RecyclerView . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( this @ MainActivity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġsettings Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtake Picture View . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtake Picture ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Picture Taken Ġ= Ġ{ Ġbitmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bitmap . width Ġ<= Ġ 4 0 9 6 Ġ&& Ġbitmap . height Ġ<= Ġ 4 0 9 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Picture ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreduce Picture Size ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrecord Video View . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Recording ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Recording Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Video View . setImage Resource ( R . drawable . ic _ record _ video ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture ?. stop Recording () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Recording () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġswitch Camera View . setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Lens Selector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( camera Lens Selector Ġ== ĠCamera Selector . DEFAULT _ BACK _ CAMERA ) ĠCamera Selector . DEFAULT _ FRONT _ CAMERA Ġelse ĠCamera Selector . DEFAULT _ BACK _ CAMERA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecreate Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecreate Camera () Ġ{ ĊĠĠĠĠĠĠĠ ĠCamera X . unbind All () ĊĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtake Picture ( on Picture Taken : Ġ( Bitmap ) Ġ-> ĠUnit ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġimage Ġcapture Ġlistener Ġwhich Ġis Ġtriggered Ġafter Ġphoto Ġhas ĊĠĠĠĠĠĠĠ Ġ// Ġbeen Ġtaken ĊĠĠĠĠĠĠĠ Ġimage Capture ?. take Picture ( Context Compat . get Main Executor ( this ), Ġobject Ġ: ĠImage Capture . On Image Capt ured Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( exc : ĠImage Capture Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Photo Ġcapture Ġfailed : Ġ${ exc . message }", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Unsafe Experimental Usage Error ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Success ( image : ĠImage Proxy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Picture Taken ( it . to Bitmap ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Capture Success ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreduce Picture Size ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ ĠExec utors . new Single Thread Executor (). execute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġ 4 0 9 6 f Ġ/ Ġbitmap . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġ 4 0 9 6 f Ġ/ Ġbitmap . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġmin ( scale X , Ġscale Y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Bitmap Ġ= ĠBitmap . create Scaled Bitmap ( bitmap , Ġ( bitmap . width Ġ* Ġscale ). toInt (), Ġ( bitmap . height Ġ* Ġscale ). toInt (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisplay Picture ( new Bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Picture Ġis Ġtoo Ġbig . ĠReduce Ġpicture Ġsize Ġin Ġsettings Ġbelow Ġ 4 0 9 6 x 4 0 9 6 .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisplay Picture ( bitmap : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpreview Picture View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Image Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġmain Handler . post Delayed ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġpreview Picture View . visibility Ġ= ĠView . GONE Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 0 0 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġopen Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ ĠCamera X . unbind All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( all Permissions Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠREQUIRED _ PERMISSION S , ĠREQUEST _ CODE _ PERMISSION S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future Ġ= ĠProcess Camera Provider . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsed Ġto Ġbind Ġthe Ġlifecycle Ġof Ġcameras Ġto Ġthe Ġlifecycle Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Provider : ĠProcess Camera Provider Ġ= Ġcamera Provider Future . get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPreview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Builder Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Capture Builder Ġ= ĠImage Capture . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Flash Mode ( configs . flash Mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvideo Capture Builder Ġ= ĠVideo Capture Config . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( configs . picture Size Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigs . picture Size ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Builder . setTarget Resolution ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture Builder . setTarget Resolution ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture Builder . setTarget Resolution ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Builder . setTarget AspectRatio ( configs . aspect Ratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture Builder . setTarget AspectRatio ( configs . aspect Ratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture Builder . setTarget AspectRatio ( configs . aspect Ratio ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= Ġpreview Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture Ġ= Ġimage Capture Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture Ġ= Ġvideo Capture Builder . build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelect Ġcamera Ġlens ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Selector Ġ= Ġcamera Lens Selector ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠU nb ind Ġuse Ġcases Ġbefore Ġre bindings ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġuse Ġcases Ġto Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġcamera Provider . bind To Lifecycle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġcamera Selector , Ġpreview , Ġimage Capture , Ġvideo Capture ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . set Surface Provider ( view Finder . create Surface Provider ( camera ?. camera Info )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Use Ġcase Ġbinding Ġfailed ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Recording () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . check Self Permission ( this , ĠManifest . permission . RECORD _ AUDIO ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( Manifest . permission . RECORD _ AUDIO ), Ġ 0 x 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecord () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Recording Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrecord Video View . setImage Resource ( R . drawable . ic _ stop ) ĊĊĠĠĠĠĠĠĠ Ġvideo Capture ?. start Recording ( video File , ĠContext Compat . get Main Executor ( this ), Ġobject Ġ: ĠVideo Capture . On Video Saved Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Video Saved ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Video Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview Video View . is Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Video () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Video View . surface Texture Listener Ġ= Ġobject Ġ: ĠTexture View . Surface Texture Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Size Changed ( surface : ĠSurface Texture ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Updated ( surface : ĠSurface Texture ?) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Destroyed ( surface : ĠSurface Texture ?) Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Surface Texture Available ( surface : ĠSurface Texture ?, Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Video () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( video Capture Error : ĠInt , Ġmessage : ĠString , Ġcause : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( java Class . simple Name , Ġ" Video ĠError : Ġ$ message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CODE _ PERMISSION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Permissions Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Permissions Ġnot Ġgranted Ġby Ġthe Ġuser .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( settings RecyclerView . visibility Ġ== ĠView . VISIBLE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsettings RecyclerView . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Settings () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġrecreate Camera () ĊĠĠĠĠĠĠĠ ĠsetUp Zoom And Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġconfigs . prepare Items ( this , Ġsettings Adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Video () Ġ{ ĊĠĠĠĠĠĠĠ ĠMedia Player (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Surface ( Surface ( preview Video View . surface Texture )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset DataSource ( video File . absolute Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Completion Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Handler . post Delayed ({ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Video Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 5 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Video Size Changed Listener Ġ{ Ġ_, Ġwidth , Ġheight Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Video View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params Ġ= Ġlayout Params . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale X Ġ= Ġpreview Video Container . width Ġ/ Ġwidth . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Y Ġ= Ġpreview Video Container . height Ġ/ Ġheight . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Ġ= Ġmin ( scale X , Ġscale Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġ( width Ġ* Ġscale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġ( height Ġ* Ġscale ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġall Permissions Granted () Ġ= ĠREQUIRED _ PERMISSION S . all Ġ{ ĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Context , Ġit ĊĠĠĠĠĠĠĠ Ġ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Pin ch To Zoom ( event : ĠMotion Event , Ġscale Gesture Detector : ĠScale Gesture Detector ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġscale Gesture Detector ?. on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Automatic Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġview Finder . after Measured Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory : ĠMet ering Point Factory Ġ= ĠSurface Oriented Met ering Point Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . width . toFloat (), Ġview Finder . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Width Ġ= Ġview Finder . width . toFloat () Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcenter Height Ġ= Ġview Finder . height . toFloat () Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// create Ġa Ġpoint Ġon Ġthe Ġcenter Ġof Ġthe Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauto Focus Point Ġ= Ġfactory . create Point ( center Width , Ġcenter Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. camera Control ?. start Focus And Met ering ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFocus Met ering Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Focus Point , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFocus Met ering Action . FLAG _ AF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// auto - focus Ġevery Ġ 1 Ġseconds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Auto Cancel Duration ( 1 , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera Info Unavailable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ERROR ", Ġ" cannot Ġaccess Ġcamera ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Tap To Focus ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( event . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory : ĠMet ering Point Factory Ġ= ĠSurface Oriented Met ering Point Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . width . toFloat (), Ġview Finder . height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġauto Focus Point Ġ= Ġfactory . create Point ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. camera Control ?. start Focus And Met ering ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFocus Met ering Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Focus Point , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFocus Met ering Action . FLAG _ AF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// focus Ġonly Ġwhen Ġthe Ġuser Ġtap Ġthe Ġpreview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Auto Cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera Info Unavailable Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d (" ERROR ", Ġ" cannot Ġaccess Ġcamera ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse Ġ// ĠUnhandled Ġevent . ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetUp Zoom And Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġscale Gesture Detector : ĠScale Gesture Detector ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( configs . pin ch To Zoom Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġobject Ġ: ĠScale Gesture Detector . Simple On Scale Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Zoom Ratio : ĠFloat Ġ= Ġcamera ?. camera Info ?. zoom State ?. value ?. zoom Ratio Ġ?: Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġdetector . scale Factor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. camera Control ?. set Zoom Ratio ( current Zoom Ratio Ġ* Ġdelta ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzoom View . text Ġ= Ġ" Zoom : Ġ%. 0 2 f ". format ( current Zoom Ratio ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscale Gesture Detector Ġ= ĠScale Gesture Detector ( this , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview Finder . after Measured Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . setOn Touch Listener Ġ{ Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOn Touch Listener Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigs . pin ch To Zoom Enabled Ġ&& Ġconfigs . focus Mode Ġ== ĠF OC US _ MODE _ T AP Ġ-> ĠsetUp Pin ch To Zoom ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscale Gesture Detector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ&& ĠsetUp Tap To Focus ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigs . pin ch To Zoom Enabled Ġ-> ĠsetUp Pin ch To Zoom ( event , Ġscale Gesture Detector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigs . focus Mode Ġ== ĠF OC US _ MODE _ T AP Ġ-> ĠsetUp Tap To Focus ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( configs . focus Mode Ġ== ĠF OC US _ MODE _ AUTO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Automatic Focus () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( configs . focus Mode Ġ== ĠF OC US _ MODE _ OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera ?. camera Control ?. cancel Focus And Met ering () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ