/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . had ro sa ur . basic bo keh . Camera Controller Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . hardware . camera 2 .* Ċ import Ġandroid . os . Build Ċ import Ġandroid . view . Surface Ċ import Ġandroidx . annotation . NonNull Ċ import Ġcom . had ro sa ur . basic bo keh .* Ċ import Ġcom . had ro sa ur . basic bo keh . MainActivity . Companion . dual Cam Logical Id Ċ import Ġcom . had ro sa ur . basic bo keh . MainActivity . Companion . normal Lens Id Ċ import Ġcom . had ro sa ur . basic bo keh . MainActivity . Companion . single Lens Ċ import Ġcom . had ro sa ur . basic bo keh . MainActivity . Companion . two Lens Ċ import Ġcom . had ro sa ur . basic bo keh . MainActivity . Companion . wide Angle Id Ċ Ċ class ĠStill Capture Session Callback ( val Ġactivity : ĠMainActivity , Ġval Ġparams : ĠCamera Params ) Ġ: ĠCamera Capture Session . Capture Callback () Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Sequence Abort ed ( session : ĠCamera Capture Session ?, Ġsequence Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġcapture Callback : ĠSequence Ġaborted .") ĊĠĠĠĠĠĠĠ Ġsuper . on Capture Sequence Abort ed ( session , Ġsequence Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Failed ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġfailure : ĠCapture Failure ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġcapture Callback : ĠCapture ĠFailed . ĠFailure : Ġ" Ġ+ Ġfailure ?. reason ) ĊĊĠĠĠĠĠĠĠ Ġ// The Ġsession Ġfailed . ĠLet 's Ġjust Ġtry Ġagain Ġ( y ay Ġinfinite Ġloops ) ĊĠĠĠĠĠĠĠ Ġclose Camera ( params , Ġactivity ) ĊĠĠĠĠĠĠĠ Ġcamera 2 Open Camera ( activity , Ġparams ) ĊĠĠĠĠĠĠĠ Ġsuper . on Capture Failed ( session , Ġrequest , Ġfailure ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Started ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġtimestamp : ĠLong , Ġframe Number : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġcapture Callback : ĠCapture ĠStarted .") ĊĠĠĠĠĠĠĠ Ġsuper . on Capture Started ( session , Ġrequest , Ġtimestamp , Ġframe Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Prog ressed ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġpartial Result : ĠCapture Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġcapture Callback : ĠCapture Ġprog ressed .") ĊĠĠĠĠĠĠĠ Ġsuper . on Capture Prog ressed ( session , Ġrequest , Ġpartial Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Buffer Lost ( session : ĠCamera Capture Session ?, Ġrequest : ĠCapture Request ?, Ġtarget : ĠSurface ?, Ġframe Number : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġcapture Callback : ĠBuffer Ġlost .") ĊĠĠĠĠĠĠĠ Ġsuper . on Capture Buffer Lost ( session , Ġrequest , Ġtarget , Ġframe Number ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Completed (@ NonNull Ġsession : ĠCamera Capture Session , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ NonNull Ġrequest : ĠCapture Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ NonNull Ġresult : ĠTotal Capture Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! params . isOpen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġon Capture Completed . ĠHo or ay ! .") Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġresult . get ( Capture Result . STAT ISTICS _ FACE _ DETECT _ MODE ) Ċ // ĠĠĠĠĠĠĠ Ġval Ġfaces Ġ= Ġresult . get ( Capture Result . STAT ISTICS _ FAC ES ) Ċ // Ċ // ĠĠĠĠĠĠĠ ĠMainActivity . Log d (" FACE - DETECT ĠDEBUG : Ġin Ġon Capture Completed . ĠCapture Result . STAT ISTICS _ FACE _ DETECT _ MODE Ġis : Ġ" Ġ+ Ġmode ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( faces Ġ!= Ġnull Ġ&& Ġmode Ġ!= Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . Log d (" faces Ġ: Ġ" Ġ+ Ġfaces . size Ġ+ Ġ" Ġ, Ġmode Ġ: Ġ" Ġ+ Ġmode ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( face Ġin Ġfaces ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= Ġface . bounds Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . Log d (" Bounds : Ġbottom : Ġ" Ġ+ Ġrect . bottom Ġ+ Ġ" Ġleft : Ġ" Ġ+ Ġrect . left Ġ+ Ġ" Ġright : Ġ" Ġ+ Ġrect . right Ġ+ Ġ" Ġtop : Ġ" Ġ+ Ġrect . top ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . Log d (" Image Ġsize : Ġ" Ġ+ Ġparams . maxSize . width Ġ+ Ġ" Ġx Ġ" Ġ+ Ġparams . maxSize . height ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( faces . isNotEmpty ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . has Face Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . face Bounds Ġ= Ġfaces . first (). bounds Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// params . face Bounds . top Ġ-= Ġ 2 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// params . face Bounds . bottom Ġ+= Ġ 2 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// params . face Bounds . right Ġ+= Ġ 2 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// params . face Bounds . left Ġ-= Ġ 2 0 Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO ĠĠĠ ĠThis Ġassumes Ġwe Ġare Ġtaking Ġmax Ġsize Ġstill s . ĠNeed Ġa ĠP refs Ġsetting . Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . top Ġ= Ġparams . face Bounds . top Ġ- Ġ( params . maxSize . height Ġ/ Ġ 8 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . bottom Ġ= Ġparams . face Bounds . bottom Ġ+ Ġ( params . maxSize . height Ġ/ Ġ 8 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . right Ġ= Ġparams . face Bounds . right Ġ+ Ġ( params . maxSize . width Ġ/ Ġ 8 ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . left Ġ= Ġparams . face Bounds . left Ġ- Ġ( params . maxSize . width Ġ/ Ġ 8 ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġsure Ġwe Ġdon 't Ġover shoot Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . expanded Face Bounds . left Ġ< Ġ 0 ) Ġparams . expanded Face Bounds . left Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . expanded Face Bounds . top Ġ< Ġ 0 ) Ġparams . expanded Face Bounds . top Ġ= Ġ 0 Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . expanded Face Bounds . right Ġ> Ġparams . maxSize . width ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . right Ġ= Ġparams . maxSize . width Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( params . expanded Face Bounds . bottom Ġ> Ġparams . maxSize . height ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . expanded Face Bounds . bottom Ġ= Ġparams . maxSize . height Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . Log d (" Adjust ed ĠFace ĠBounds : Ġbottom : Ġ" Ġ+ Ġparams . expanded Face Bounds . bottom Ġ+ Ġ" Ġleft : Ġ" Ġ+ Ġparams . expanded Face Bounds . left Ġ+ Ġ" Ġright : Ġ" Ġ+ Ġparams . expanded Face Bounds . right Ġ+ Ġ" Ġtop : Ġ" Ġ+ Ġparams . expanded Face Bounds . top ) Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Pref Helper . get Grab Cut ( activity )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Expand Ġface box Ġto Ġinclude Ġan Ġextra Ġ" head " Ġto Ġleft Ġand Ġright , Ġand Ġall Ġthe Ġway Ġto Ġbottom Ġof Ġphoto Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . grab Cut Bounds Ġ= Ġface Bounds To Grab Cut Bounds ( activity , Ġparams . expanded Face Bounds , Ġparams . maxSize . width , Ġparams . maxSize . height ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity . Log d (" Grab cut ĠBounds : Ġbottom : Ġ" Ġ+ Ġparams . grab Cut Bounds . bottom Ġ+ Ġ" Ġleft : Ġ" Ġ+ Ġparams . grab Cut Bounds . left Ġ+ Ġ" Ġright : Ġ" Ġ+ Ġparams . grab Cut Bounds . right Ġ+ Ġ" Ġtop : Ġ" Ġ+ Ġparams . grab Cut Bounds . top ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// It Ġmight Ġbe Ġthat Ġwe Ġreceived Ġthis Ġcallback Ġfirst Ġand Ġwe 're Ġwaiting Ġfor Ġthe Ġimage ĊĠĠĠĠĠĠĠ Ġif Ġ( two Lens . is Two Lens Shot ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( params . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdual Cam Logical Id -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Shot Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Shot Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Params Ġ= ĠMainActivity . camera Params . get ( normal Lens Id ) Ġ?: Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Params Ġ= ĠMainActivity . camera Params . get ( wide Angle Id ) Ġ?: Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Params . has Face Ġ= Ġparams . has Face ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Params . face Bounds Ġ= Ġparams . face Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Params . expanded Face Bounds Ġ= Ġparams . expanded Face Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Params . has Face Ġ= Ġparams . has Face ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Params . face Bounds Ġ= Ġparams . face Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Params . expanded Face Bounds Ġ= Ġparams . expanded Face Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwide Angle Id -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Shot Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Params Ġ= Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Lens Id -> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Shot Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Params Ġ= Ġparams ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( two Lens . wide Shot Done Ġ&& Ġtwo Lens . normal Shot Done ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnull Ġ!= Ġtwo Lens . wide Image ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġnull Ġ!= Ġtwo Lens . normal Image ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Bitmap : ĠBitmap Ġ= ĠDo Bo keh ( activity , Ġtwo Lens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Capt ured Photo ( activity , Ġparams . captured Photo , Ġfinal Bitmap ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . normal Image ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtwo Lens . wide Image ?. close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . capture Finished () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Lens . shot Done Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Image Ready Ġmight Ġhave Ġbeen Ġrece vi ed Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġsingle Lens . image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( 2 8 Ġ<= ĠBuild . VERSION . SDK _ INT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . background Executor . execute ( Image Saver ( activity , Ġparams , Ġsingle Lens . image , Ġparams . captured Photo , Ġparams . is Front , Ġparams )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . background Handler ?. post ( Image Saver ( activity , Ġparams , Ġsingle Lens . image , Ġparams . captured Photo , Ġparams . is Front , Ġparams )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠMainActivity . Log d (" capture Still Picture Ġon Capture Completed . ĠCapture End .") ĊĠĠĠĠĠĠĠ Ġcreate Camera Preview Session ( activity , Ġparams . device !! , Ġparams ) ĊĠĠĠ Ġ} ĊĊĊ Ċ } Ċ