/** Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 . Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠSimple Ġapp Ġto Ġdemonstrate ĠCamera X ĠVideo Ġcapturing Ġwith ĠRec order Ġ( Ġto Ġlocal Ġfiles Ġ), Ġwith Ġthe Ċ Ġ* Ġfollowing Ġsimple Ġcontrol Ġfollow : Ċ Ġ* ĠĠ Ġ- Ġuser Ġstarts Ġcapture . Ċ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġdisables Ġall ĠUI Ġselections . Ċ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġenables Ġcapture Ġrun - time ĠUI Ġ( pause / resume / stop ). Ċ Ġ* ĠĠ Ġ- Ġuser Ġcontrols Ġrecording Ġwith Ġrun - time ĠUI , Ġeventually Ġtap Ġ" stop " Ġto Ġend . Ċ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġinform s ĠCamera X Ġrecording Ġto Ġstop Ġwith Ġrecording . stop () Ġ( or Ġrecording . close ()). Ċ Ġ* ĠĠ Ġ- ĠCamera X Ġnotify Ġthis Ġapp Ġthat Ġthe Ġrecording Ġis Ġindeed Ġstopped , Ġwith Ġthe ĠFinal ize Ġevent . Ċ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġstarts ĠVideo Viewer Ġfragment Ġto Ġview Ġthe Ġcaptured Ġresult . Ċ */ Ċ Ċ package Ġcom . example . android . cam er ax . video . fragments Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget .* Ċ import Ġandroidx . camera . core . AspectRatio Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Navigation Ċ import Ġcom . example . android . cam er ax . video . R Ċ import Ġcom . example . android . cam er ax . video . databinding . Fragment Camera Binding Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . camera . core . Camera Selector Ċ import Ġandroidx . camera . core . Preview Ċ import Ġandroidx . camera . video .* Ċ import Ġandroidx . concurrent . futures . await Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . util . Consumer Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . lifecycle . when Created Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġcom . example . android . camera . utils . Generic ListAdapter Ċ import Ġkotlinx . coroutines .* Ċ import Ġjava . util .* Ċ Ċ class ĠCamera Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġ// ĠUI Ġwith ĠView Binding ĊĠĠĠ Ġprivate Ġvar Ġ_ fragment Camera Binding : ĠFragment Camera Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġfragment Camera Binding Ġget () Ġ= Ġ_ fragment Camera Binding !! ĊĠĠĠ Ġprivate Ġvar Ġprev Quality Selector View : View ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠHost 's Ġnavigation Ġcontroller Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġnav Controller : ĠNav Controller Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠNavigation . find Nav Controller ( require Activity (), ĠR . id . fragment _ container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcamera Capabilities Ġ= Ġmutable ListOf < Camera Capability >() ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġvideo Capture : ĠVideo Capture < Recorder > ĊĠĠĠ Ġprivate Ġvar Ġactive Recording : ĠActiveRecord ing ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrecording State : Video Record Event ĊĊĠĠĠ Ġ// ĠCamera ĠUI Ġ Ġstates Ġand Ġinputs ĊĠĠĠ Ġenum Ġclass ĠUi State Ġ{ ĊĠĠĠĠĠĠĠ ĠID LE , ĠĠĠĠĠĠ Ġ// ĠNot Ġrecording , Ġall ĠUI Ġcontrols Ġare Ġactive . ĊĠĠĠĠĠĠĠ ĠREC ORD ING , Ġ Ġ// ĠCamera Ġis Ġrecording , Ġonly Ġdisplay ĠPause / Resume Ġ& ĠStop Ġbutton . ĊĠĠĠĠĠĠĠ ĠFIN AL IZED , Ġ Ġ// ĠRecord ing Ġjust Ġcompletes , Ġdisable Ġall ĠREC ORD ING ĠUI Ġcontrols . ĊĠĠĠĠĠĠĠ ĠRE COVERY ĠĠĠ Ġ// ĠFor Ġfuture Ġuse . ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġcamera Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġquality Selector Index Ġ= ĠDEFAULT _ QUAL ITY _ SELECT OR _ IDX ĊĠĠĠ Ġprivate Ġvar Ġaudio Enabled Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġval Ġmain Thread Executor Ġby Ġlazy Ġ{ ĠContext Compat . get Main Executor ( require Context ()) Ġ} ĊĠĠĠ Ġprivate Ġvar Ġenumeration Deferred : Deferred < Unit >? Ġ= Ġnull ĊĊĠĠĠ Ġ// Ġmain Ġcamera X Ġcapture Ġfunctions ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠĠ ĠAlways Ġbind Ġpreview Ġ+ Ġvideo Ġcapture Ġuse Ġcase Ġcombinations Ġin Ġthis Ġsample ĊĠĠĠĠ Ġ* ĠĠ Ġ( Video Capture Ġcan Ġwork Ġon Ġits Ġown ). ĠThe Ġfunction Ġshould Ġalways Ġexecute Ġon ĊĠĠĠĠ Ġ* ĠĠ Ġthe Ġmain Ġthread . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġbind Capture Use case () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Ġ= ĠProcess Camera Provider . getInstance ( require Context ()). await () ĊĊĠĠĠĠĠĠĠ Ġval Ġcamera Selector Ġ= Ġget Camera Selector ( camera Index ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġthe Ġuser Ġrequired ĠQuality Selector Ġ( video Ġresolution ): Ġwe Ġknow Ġthis Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġsupported , Ġa Ġvalid Ġquality Selector Ġwill Ġbe Ġcreated . ĊĠĠĠĠĠĠĠ Ġval Ġquality Ġ= Ġcamera Capabilities [ camera Index ]. quality Selector [ quality Selector Index ] ĊĠĠĠĠĠĠĠ Ġval Ġquality Selector Ġ= ĠQuality Selector . of ( quality ) ĊĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . preview View . update LayoutParams < Constraint Layout . LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġthis @ Camera Fragment . resources . configuration . orientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdimension Ratio Ġ= Ġquality Selector . get AspectRatio String ( quality , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( orientation Ġ== ĠConfiguration . OR IENTATION _ POR TRA IT )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget AspectRatio ( quality Selector . get AspectRatio ( quality )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Surface Provider ( fragment Camera Binding . preview View . surface Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġa Ġrecorder , Ġwhich Ġcan : ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ- Ġrecord Ġvideo / audio Ġto ĠMedia Store ( only Ġshown Ġhere ), ĠFile , ĠParcel FileDescriptor ĊĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ- Ġbe Ġused Ġcreate Ġrecording ( s ) Ġ( the Ġrecording Ġperforms Ġrecording ) ĊĠĠĠĠĠĠĠ Ġval Ġrecorder Ġ= ĠRec order . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Quality Selector ( quality Selector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġvideo Capture Ġ= ĠVideo Capture . with Output ( recorder ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . bind To Lifecycle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Selector , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġon Ġmain Ġthread , Ġlet 's Ġreset Ġthe Ġcontrols Ġon Ġthe ĠUI . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Use Ġcase Ġbinding Ġfailed ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreset UI and State (" bind To Lifecycle Ġfailed : Ġ$ exc ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġenable UI ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠK ick Ġstart Ġthe Ġvideo Ġrecording ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġconfig ĠRec order Ġto Ġcapture Ġto ĠMedia Store Output ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġregister ĠRecord Event ĠListener ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġapply Ġaudio Ġrequest Ġfrom Ġuser ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġstart Ġrecording ! ĊĠĠĠĠ Ġ* ĠAfter Ġthis Ġfunction , Ġuser Ġcould Ġstart / pause / resume / stop Ġrecording Ġand Ġapplication Ġlist ens ĊĠĠĠĠ Ġ* Ġto ĠVideo Record Event Ġfor Ġthe Ġcurrent Ġrecording Ġstatus . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġstart Recording () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcreate ĠMedia Store Output Options Ġfor Ġour Ġrecorder : Ġresulting Ġour Ġrecording ! ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġ" Camera X - recording -" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat ( FILENAME _ FORMAT , ĠLocale . US ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. format ( System . currentTimeMillis ()) Ġ+ Ġ". mp 4 " ĊĠĠĠĠĠĠĠ Ġval Ġcontent Values Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Media Store . Video . Media . DISPLAY _ NAME , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmedia Store Output Ġ= ĠMedia Store Output Options . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). content Resolver , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Values ( content Values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// Ġconfigure ĠRec order Ġand ĠStart Ġrecording Ġto Ġthe Ġmedia Store Output . ĊĠĠĠĠĠĠĠ Ġactive Recording Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvideo Capture . output . prepare Recording ( require Activity (), Ġmedia Store Output ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with EventListener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Thread Executor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Listener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġif Ġ( audio Enabled ) Ġwith Audio Enabled () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Recording Ġstarted ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCapture Event Ġlistener . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcapture Listener Ġ= ĠConsumer < Video Record Event > Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠ Ġ// Ġcache Ġthe Ġrecording Ġstate ĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ! is ĠVideo Record Event . Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecording State Ġ= Ġevent ĊĊĠĠĠĠĠĠĠ Ġupdate UI ( event ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġis ĠVideo Record Event . Finalize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Video ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve Ġthe Ġasked Ġcamera 's Ġtype ( lens Ġfacing Ġtype ). ĠIn Ġthis Ġsample , Ġonly Ġ 2 Ġtypes : ĊĠĠĠĠ Ġ* ĠĠ Ġidx Ġis Ġeven Ġnumber : Ġ ĠCamera Selector . LEN S _ F ACING _ BACK ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠĠĠĠ Ġodd Ġnumber : ĠĠ ĠCamera Selector . LEN S _ F ACING _ FRONT ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Camera Selector ( idx : ĠInt ) Ġ: ĠCamera Selector Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Capabilities . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Error : ĠThis Ġdevice Ġdoes Ġnot Ġhave Ġany Ġcamera , Ġb ailing Ġout ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). finish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( camera Capabilities [ idx Ġ% Ġcamera Capabilities . size ]. cam Selector ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠCamera Capability ( val Ġcam Selector : ĠCamera Selector , Ġval Ġquality Selector : List < Int >) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠQuery Ġand Ġcache Ġthis Ġplatform 's Ġcamera Ġcapabilities , Ġrun Ġonly Ġonce . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġenumeration Deferred Ġ= Ġlifecycle Scope . async Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Created Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= ĠProcess Camera Provider . getInstance ( require Context ()). await () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . unbind All () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( cam Selector Ġin ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . DEFAULT _ BACK _ CAMERA , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . DEFAULT _ FRONT _ CAMERA ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjust Ġwant Ġto Ġget Ġthe Ġcamera . camera Info Ġto Ġquery Ġcapabilities ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġare Ġnot Ġbinding Ġanything Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider . has Camera ( cam Selector )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Ġ= Ġprovider . bind To Lifecycle ( require Activity (), Ġcam Selector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquality Cap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . get Supported Qual ities ( camera . camera Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġquality Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ U HD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ F HD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ HD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ SD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). contains ( quality ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Capabilities . add ( Camera Capability ( cam Selector , Ġquality Cap )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Camera ĠFace Ġ$ cam Selector Ġis Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOne Ġtime Ġinitialize Ġfor ĠCamera Fragment , Ġstarts Ġwhen Ġview Ġis Ġcreated . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinit Camera Fragment () Ġ{ ĊĠĠĠĠĠĠĠ Ġinitialize UI () Ġ Ġ// ĠUI Ġcontrols Ġexcept Ġthe ĠQuality Selector Ġare Ġinitialized ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġdisabled ; Ġneed Ġto Ġwait Ġfor Ġquality Ġenumeration Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcomplete Ġthen Ġresume ĠUI Ġinitialization ĊĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enumeration Deferred Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenumeration Deferred !!. await () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenumeration Deferred Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Quality Sections UI () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Capture Use case () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize ĠUI . ĠPreview Ġand ĠCapture Ġactions Ġare Ġconfigured Ġin Ġthis Ġfunction . ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġpreview Ġand Ġcapture Ġare Ġboth Ġinitialized Ġeither Ġby ĠUI Ġor ĠCamera X Ġcallbacks ĊĠĠĠĠ Ġ* Ġ( except Ġthe Ġvery Ġ 1 st Ġtime Ġupon Ġentering Ġto Ġthis Ġfragment Ġin ĠonCreate View () ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ", Ġ" Missing Permission ") ĊĠĠĠ Ġprivate Ġfun Ġinitialize UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . camera Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Index Ġ= Ġ( camera Index Ġ+ Ġ 1 ) Ġ% Ġcamera Capabilities . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcamera Ġdevice Ġchange Ġis Ġinstant : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ- Ġpreview Ġneeds Ġto Ġbe Ġrestarted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ- Ġquality Selector Ġselection Ġis Ġinvalid ated ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġ- Ġcamera Ġselector ĠUI Ġneed Ġto Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquality Selector Index Ġ= ĠDEFAULT _ QUAL ITY _ SELECT OR _ IDX ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Quality Sections UI () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable UI ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Capture Use case () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġaudio Enabled Ġby Ġdefault Ġis Ġdisabled . ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . audio Selection . isChecked Ġ= Ġaudio Enabled ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . audio Selection . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Enabled Ġ= Ġfragment Camera Binding . audio Selection . isChecked ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠReact Ġto Ġuser Ġtouch ing Ġthe Ġcapture Ġbutton ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this @ Camera Fragment :: recording State . isInitialized Ġ|| Ġrecording State Ġis ĠVideo Record Event . Finalize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable UI ( false ) Ġ Ġ// ĠOur Ġevent Listener Ġwill Ġturn Ġon Ġthe ĠRecord ing ĠUI . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Recording () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( recording State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Recording ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . stop Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Pause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Recording ?. resume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Resume Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Recording ?. pause () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unknown ĠState Ġ($ recording State ) Ġwhen ĠCapture ĠButton Ġis Ġpressed Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . stop Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstopping : Ġhide Ġit Ġafter Ġgetting Ġa Ġclick Ġbefore Ġwe Ġgo Ġto Ġviewing Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . stop Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Recording Ġ== Ġnull Ġ|| Ġrecording State Ġis ĠVideo Record Event . Finalize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecording Ġ= Ġactive Recording ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( recording Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecording . stop () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Recording Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Button . setImage Resource ( R . drawable . ic _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġensure Ġthe Ġstop Ġbutton Ġis Ġinitialized Ġdisabled Ġ& Ġinvisible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Status . text Ġ= ĠgetString ( R . string . Idle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate UI Ġaccording Ġto ĠCamera X ĠVideo Record Event Ġtype : ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġuser Ġstarts Ġcapture . ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġdisables Ġall ĠUI Ġselections . ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġenables Ġcapture Ġrun - time ĠUI Ġ( pause / resume / stop ). ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġuser Ġcontrols Ġrecording Ġwith Ġrun - time ĠUI , Ġeventually Ġtap Ġ" stop " Ġto Ġend . ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġinform s ĠCamera X Ġrecording Ġto Ġstop Ġwith Ġrecording . stop () Ġ( or Ġrecording . close ()). ĊĠĠĠĠ Ġ* ĠĠ Ġ- ĠCamera X Ġnotify Ġthis Ġapp Ġthat Ġthe Ġrecording Ġis Ġindeed Ġstopped , Ġwith Ġthe ĠFinal ize Ġevent . ĊĠĠĠĠ Ġ* ĠĠ Ġ- Ġthis Ġapp Ġstarts ĠVideo Viewer Ġfragment Ġto Ġview Ġthe Ġcaptured Ġresult . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate UI ( event : ĠVideo Record Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġif Ġ( event Ġis ĠVideo Record Event . Status ) Ġrecording State . getName () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġevent . getName () ĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Status Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġplaceholder : Ġwe Ġupdate Ġthe ĠUI Ġwith Ġnew Ġstatus Ġafter Ġthis Ġwhen () Ġblock , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnothing Ġneeds Ġto Ġdo Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Start Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow UI ( Ui State . RECORD ING , Ġevent . getName ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Finalize -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow UI ( Ui State . FINAL IZED , Ġevent . getName ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Pause Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Button . setImage Resource ( R . drawable . ic _ resume ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Resume Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Button . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstats Ġ= Ġevent . recording Stats ĊĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġstats . num Bytes Re corded Ġ/ Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= Ġjava . util . concurrent . TimeUnit . NAN O SECONDS . to Seconds ( stats . re corded Duration Nan os ) ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġ"${ state }: Ġrecorded Ġ${ size } KB , Ġin Ġ${ time } second " ĊĠĠĠĠĠĠĠ Ġif ( event Ġis ĠVideo Record Event . Finalize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"${ text }\ n File Ġsaved Ġto : Ġ${ event . output Results . output Uri }" ĊĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Status . text = text ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" recording Ġevent : Ġ$ text ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnable / disable ĠUI : ĊĠĠĠĠ Ġ* ĠĠĠ ĠUser Ġcould Ġselect Ġthe Ġcapture Ġparameters Ġwhen Ġrecording Ġis Ġnot Ġin Ġsession ĊĠĠĠĠ Ġ* ĠĠĠ ĠOnce Ġrecording Ġis Ġstarted , Ġneed Ġto Ġdisable Ġable ĠUI Ġto Ġavoid Ġconflict . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġenable UI ( enable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( fragment Camera Binding . camera Button , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . capture Button , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . stop Button , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . audio Selection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . quality Selection ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isEnabled Ġ= Ġenable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdisable Ġthe Ġcamera Ġbutton Ġif Ġno Ġdevice Ġto Ġswitch ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Capabilities . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . camera Button . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġdisable Ġthe Ġresolution Ġlist Ġif Ġno Ġresolution Ġto Ġswitch ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Capabilities [ camera Index ]. quality Selector . size Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . quality Selection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġinitialize ĠUI Ġfor Ġrecording : ĊĠĠĠĠ Ġ* Ġ Ġ- Ġat Ġrecording : Ġhide Ġaudio , Ġquality Selection , change Ġcamera ĠUI ; Ġenable Ġstop Ġbutton ĊĠĠĠĠ Ġ* Ġ Ġ- Ġotherwise : Ġshow Ġall Ġexcept Ġthe Ġstop Ġbutton ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow UI ( state : ĠUi State , Ġstatus : String Ġ= Ġ" idle ") Ġ{ ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . IDLE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . capture Button . setImage Resource ( R . drawable . ic _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Button . visibility Ġ= ĠView . IN VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . camera Button . visibility = ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . audio Selection . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . quality Selection . visibility = View . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . RECORD ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . camera Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . audio Selection . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . quality Selection . visibility Ġ= ĠView . IN VISIBLE ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . capture Button . setImage Resource ( R . drawable . ic _ pause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . capture Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Button . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Button . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUi State . FINAL IZED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . capture Button . setImage Resource ( R . drawable . ic _ start ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop Button . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Msg Ġ= Ġ" Error : Ġshow UI ($ state ) Ġis Ġnot Ġsupported " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġerror Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . capture Status . text Ġ= Ġstatus ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReset UI Ġ( restart ): ĊĠĠĠĠ Ġ* ĠĠĠ Ġin Ġcase Ġbinding Ġfailed , Ġlet 's Ġgive Ġit Ġanother Ġchange Ġfor Ġre - try . ĠIn Ġfuture Ġcases ĊĠĠĠĠ Ġ* ĠĠĠ Ġwe Ġmight Ġfail Ġand Ġuser Ġget Ġnotified Ġon Ġthe Ġstatus ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġreset UI and State ( reason : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġenable UI ( true ) ĊĠĠĠĠĠĠĠ Ġshow UI ( Ui State . IDLE , Ġreason ) ĊĊĠĠĠĠĠĠĠ Ġcamera Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġquality Selector Index Ġ= ĠDEFAULT _ QUAL ITY _ SELECT OR _ IDX ĊĠĠĠĠĠĠĠ Ġaudio Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . audio Selection . isChecked Ġ= Ġaudio Enabled ĊĠĠĠĠĠĠĠ Ġinitialize Quality Sections UI () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ Ġinitialize Quality Sections UI (): ĊĠĠĠĠ Ġ* ĠĠĠ ĠPopulate Ġa ĠRecyclerView Ġto Ġdisplay Ġcamera Ġcapabilities : ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġ- Ġone Ġfront Ġfacing ĊĠĠĠĠ Ġ* ĠĠĠĠĠĠ Ġ- Ġone Ġback Ġfacing ĊĠĠĠĠ Ġ* ĠĠĠ ĠUser Ġselection Ġis Ġsaved Ġto Ġquality Selector Index , Ġwill Ġbe Ġused ĊĠĠĠĠ Ġ* ĠĠĠ Ġin Ġthe Ġbind Capture Use case (). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġinitialize Quality Sections UI () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselector Strings Ġ= Ġcamera Capabilities [ camera Index ]. quality Selector . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquality Map . getString ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġthe Ġadapter Ġto ĠQuality Selector ĠRecyclerView ĊĠĠĠĠĠĠĠ Ġfragment Camera Binding . quality Selection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= ĠGeneric ListAdapter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselector Strings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Layout Id Ġ= ĠR . layout . video _ quality _ item ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġholder View , Ġq c String , Ġposition Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder View . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . quality TextView )?. text Ġ= Ġq c String ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġselect Ġthe Ġdefault Ġquality Ġselector ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Selected Ġ= Ġ( position Ġ== Ġquality Selector Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġholder View . setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( quality Selector Index Ġ== Ġposition ) Ġreturn @ setOnClickListener ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Camera Binding . quality Selection . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġde select Ġthe Ġprevious Ġselection Ġon ĠUI . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . find ViewHolder For Adapter Position ( quality Selector Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . item View ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġturn Ġon Ġthe Ġnew Ġselection Ġon ĠUI . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquality Selector Index Ġ= Ġposition ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre bind Ġthe Ġuse Ġcases Ġto Ġput Ġthe Ġnew ĠQuality Selection Ġin Ġaction . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable UI ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Lifecycle Owner . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Capture Use case () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDisplay Ġcapture Ġthe Ġvideo Ġin ĠMedia Store ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġevent : ĠVideo Record Event . Finalize Ġholding ĠMedia Store ĠURI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Video ( event : ĠVideo Record Event ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( event Ġ! is ĠVideo Record Event . Finalize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Fragment Directions . action Camera Fragment To Video Viewer ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . output Results . output Uri ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠSystem Ġfunction Ġimplementations ĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ fragment Camera Binding Ġ= ĠFragment Camera Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfragment Camera Binding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġinit Camera Fragment () ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ fragment Camera Binding Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdefault ĠQuality Selector Ġif Ġno Ġinput Ġfrom ĠUI ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ QUAL ITY _ SELECT OR _ IDX Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval ĠTAG : String Ġ= ĠCamera Fragment :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġquality Map Ġ= ĠQuality Map () ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIL ENAME _ FORMAT Ġ= Ġ" yyyy - MM - dd - HH - mm - ss - SS S " ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġa Ġhelper Ġclass Ġmapping ĠQuality Selector . value Ġ< --> Ġits Ġstring Ċ Ġ*/ Ċ internal Ġclass ĠQuality Map Ġ{ ĊĠĠĠ Ġprivate Ġval Ġquality ToString Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ U HD Ġto Ġ" QUAL ITY _ U HD ( 2 1 6 0 p )", ĊĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ F HD Ġto Ġ" QUAL ITY _ F HD ( 1 0 8 0 p )", ĊĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ HD Ġto Ġ" QUAL ITY _ HD ( 7 2 0 p )", ĊĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ SD Ġto Ġ" QUAL ITY _ SD ( 4 8 0 p )" ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġstring To Quality Ġ= Ġquality ToString . map Ġ{ ĠPair ( it . value , Ġit . key ) Ġ}. toMap () ĊĊĠĠĠ Ġfun ĠgetString ( key : Int ) Ġ: String Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquality ToString [ key ] !! ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Camera Fragment . TAG , Ġ" Quality Selector Ġ$ Int Ġis ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Not ĠSupported " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun ĠgetKey ( description Ġ: ĠString ) Ġ: ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring To Quality [ description ] !! ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : Ġjava . lang . Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Camera Fragment . TAG , Ġ" Quality Ġ$ description Ġis ĠNOT Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġa Ġhelper Ġfunction Ġto Ġretrieve Ġthe Ġaspect Ġratio Ġfrom Ġa ĠQuality Selector Ġenum . Ċ Ġ*/ Ċ fun ĠQuality Selector . get AspectRatio ( quality : Int ): ĠInt Ġ{ ĊĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( Quality Selector . QUAL ITY _ U HD , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ F HD , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ HD ). contains ( quality ) Ġ-> ĠAs pect Ratio . RATIO _ 1 6 _ 9 ĊĊĠĠĠĠĠĠĠ Ġ( quality Ġ== Ġ ĠQuality Selector . QUAL ITY _ SD ) Ġ-> ĠAs pect Ratio . RATIO _ 4 _ 3 ĊĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġa Ġhelper Ġfunction Ġto Ġretrieve Ġthe Ġaspect Ġratio Ġstring Ġfrom Ġa ĠQuality Selector Ġenum . Ċ Ġ*/ Ċ fun ĠQuality Selector . get AspectRatio String ( quality : Int , Ġpor trait Mode : Boolean ) Ġ: String ? Ġ{ ĊĠĠĠ Ġval Ġwidth : Int ĊĠĠĠ Ġval Ġheight : Int ĊĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf ( Quality Selector . QUAL ITY _ U HD , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ F HD , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠQuality Selector . QUAL ITY _ HD ). contains ( quality ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 9 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġquality Ġ== Ġ ĠQuality Selector . QUAL ITY _ SD Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( portrait Mode ) Ġ" V ,$ height :$ width " Ġelse Ġ" H ,$ width :$ height " Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġhelper Ġextended Ġfunction Ġto Ġget Ġthe Ġname ( string ) Ġfor Ġthe ĠVideo Record Event . Ċ Ġ*/ Ċ fun ĠVideo Record Event . getName () Ġ: ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Status Ġ-> Ġ" Status " ĊĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Start Ġ-> Ġ" Started " ĊĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Finalize -> Ġ" Final ized " ĊĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Pause Ġ-> Ġ" Paused " ĊĠĠĠĠĠĠĠ Ġis ĠVideo Record Event . Resume Ġ-> Ġ" Res umed " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException () ĊĠĠĠ Ġ} Ċ } Ċ