/* Ċ Ġ* ĠCopyright Ġ( C ) ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠMod ifications Ġcopyright Ġ( C ) Ġ 2 0 1 9 ĠRad ix ĠD LT Ċ Ġ* Ċ Ġ* Ġ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 . radix d lt . android . apps . wallet . ui . camera Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . Surface View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Requires Permission Ċ import Ġtim ber . log . Tim ber Ċ import Ġjava . io . IOException Ċ Ċ class ĠCamera Source Preview ( private Ġval Ġctx : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: ĊĠĠĠ ĠViewGroup ( ctx , Ġattrs ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsurface View : ĠSurface View ĊĠĠĠ Ġprivate Ġvar Ġstart Requested : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġsurface Available : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcamera Source : ĠCamera Source ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġoverlay : ĠGraph ic Overlay < *> ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġis Por trait Mode : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġctx . resources . configuration . orientation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠConfiguration . OR IENTATION _ POR TRA IT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . d (" is Por trait Mode Ġreturning Ġfalse Ġby Ġdefault ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġsurface Available Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġsurface View Ġ= ĠSurface View ( ctx ) ĊĠĠĠĠĠĠĠ Ġsurface View . holder . add Callback ( Surface Callback ()) ĊĠĠĠĠĠĠĠ Ġadd View ( surface View ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Permission ( Manifest . permission . CAMERA ) ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠSecurity Exception :: class ) ĊĠĠĠ Ġfun Ġstart ( camera Source : ĠCamera Source ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Source Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . camera Source Ġ= Ġcamera Source ĊĊĠĠĠĠĠĠĠ Ġif Ġ( this . camera Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart If Ready () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Permission ( Manifest . permission . CAMERA ) ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠSecurity Exception :: class ) ĊĠĠĠ Ġfun Ġstart ( camera Source : ĠCamera Source , Ġoverlay : ĠGraph ic Overlay <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . overlay Ġ= Ġoverlay ĊĠĠĠĠĠĠĠ Ġstart ( camera Source ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source !!. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source !!. release () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Permission ( Manifest . permission . CAMERA ) ĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠSecurity Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġstart If Ready () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( start Requested Ġ&& Ġsurface Available ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source !!. start ( surface View . holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( overlay Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġcamera Source !!. preview Size !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmin Ġ= ĠMath . min ( size . width , Ġsize . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Ġ= ĠMath . max ( size . width , Ġsize . height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Por trait Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSwap Ġwidth Ġand Ġheight Ġsizes Ġwhen Ġin Ġpor trait , Ġsince Ġit Ġwill Ġbe Ġrotated Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 9 0 Ġdegrees ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay !!. set Camera Info ( min , Ġmax , Ġcamera Source !!. camera Facing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay !!. set Camera Info ( max , Ġmin , Ġcamera Source !!. camera Facing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverlay !!. clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSurface Callback Ġ: ĠSurface Holder . Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Created ( surface : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Available Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart If Ready () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( se : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( se , Ġ" Do Ġnot Ġhave Ġpermission Ġto Ġstart Ġthe Ġcamera ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e , Ġ" Could Ġnot Ġstart Ġcamera Ġsource .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( surface : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Available Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Changed ( holder : ĠSurface Holder , Ġformat : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpreview Width Ġ= Ġ 3 2 0 ĊĠĠĠĠĠĠĠ Ġvar Ġpreview Height Ġ= Ġ 2 4 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( camera Source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġcamera Source !!. preview Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Width Ġ= Ġsize . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Height Ġ= Ġsize . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSwap Ġwidth Ġand Ġheight Ġsizes Ġwhen Ġin Ġpor trait , Ġsince Ġit Ġwill Ġbe Ġrotated Ġ 9 0 Ġdegrees ĊĠĠĠĠĠĠĠ Ġif Ġ( is Por trait Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġpreview Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Width Ġ= Ġpreview Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Height Ġ= Ġtmp ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġview Width Ġ= Ġright Ġ- Ġleft ĊĠĠĠĠĠĠĠ Ġval Ġview Height Ġ= Ġbottom Ġ- Ġtop ĊĊĠĠĠĠĠĠĠ Ġval Ġchild Width : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġchild Height : ĠInt ĊĠĠĠĠĠĠĠ Ġvar Ġchild X Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġchild Y Offset Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ratio Ġ= Ġview Width . toFloat () Ġ/ Ġpreview Width . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġheight Ratio Ġ= Ġview Height . toFloat () Ġ/ Ġpreview Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġ// ĠTo Ġfill Ġthe Ġview Ġwith Ġthe Ġcamera Ġpreview , Ġwhile Ġalso Ġpre serving Ġthe Ġcorrect Ġaspect Ġratio , ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġis Ġusually Ġnecessary Ġto Ġslightly Ġover size Ġthe Ġchild Ġand Ġto Ġcrop Ġoff ĊĠĠĠĠĠĠĠ Ġ// Ġportions Ġalong Ġone Ġof Ġthe Ġdimensions . Ġ ĠWe Ġscale Ġup Ġbased Ġon Ġthe Ġdimension Ġrequiring Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġmost Ġcorrection , Ġand Ġcompute Ġa Ġcrop Ġoffset Ġfor Ġthe Ġother Ġdimension . ĊĠĠĠĠĠĠĠ Ġif Ġ( width Ratio Ġ> Ġheight Ratio ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Width Ġ= Ġview Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Height Ġ= Ġ( preview Height . toFloat () Ġ* Ġwidth Ratio ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Y Offset Ġ= Ġ( child Height Ġ- Ġview Height ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Width Ġ= Ġ( preview Width . toFloat () Ġ* Ġheight Ratio ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Height Ġ= Ġview Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild X Offset Ġ= Ġ( child Width Ġ- Ġview Width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġchild Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOne Ġdimension Ġwill Ġbe Ġc ropped . Ġ ĠWe Ġshift Ġchild Ġover Ġor Ġup Ġby Ġthis Ġoffset Ġand Ġadjust ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġsize Ġto Ġmaintain Ġthe Ġproper Ġaspect Ġratio . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Child At ( i ). layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 Ġ* Ġchild X Offset , Ġ- 1 Ġ* Ġchild Y Offset , Ġchild Width Ġ- Ġchild X Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Height Ġ- Ġchild Y Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart If Ready () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTim ber . e ( e , Ġ" Could Ġnot Ġstart Ġcamera Ġsource .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ