/* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġ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 Ġandroidx . camera . integration . extensions . validation Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Gesture Detector Ċ import Ġandroid . view . Gesture Detector . Simple On Gesture Listener Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . Scale Gesture Detector Ċ import Ġandroid . view . Scale Gesture Detector . Simple On Scale Gesture Listener Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Image Button Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . camera . core . Camera Ċ import Ġandroidx . camera . core . Camera Control Ċ import Ġandroidx . camera . core . Camera Info Ċ import Ġandroidx . camera . core . Display Oriented Met ering Point Factory Ċ import Ġandroidx . camera . core . Focus Met ering Action Ċ import Ġandroidx . camera . core . Focus Met ering Result Ċ import Ġandroidx . camera . core . Image Capture Ċ import Ġandroidx . camera . core . Image Capture . FLASH _ MODE _ AUTO Ċ import Ġandroidx . camera . core . Image Capture . FLASH _ MODE _ OFF Ċ import Ġandroidx . camera . core . Image Capture . FLASH _ MODE _ ON Ċ 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 . impl . utils . executor . Camera X Executors Ċ import Ġandroidx . camera . extensions . Extension Mode Ċ import Ġandroidx . camera . extensions . Extensions Manager Ċ import Ġandroidx . camera . integration . extensions . R Ċ import Ġandroidx . camera . integration . extensions . utils . Camera Selector Util . create Camera Selector ById Ċ import Ġandroidx . camera . integration . extensions . utils . Extension Mode Util . getExtension Mode String From Id Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ CAMERA _ ID Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ ERROR _ CODE Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ EXTENSION _ MODE Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ IMAGE _ ROT ATION _ DE GRE ES Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ IMAGE _ URI Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ LEN S _ F ACING Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INT ENT _ EXTRA _ KEY _ REQUEST _ CODE Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . INVALID _ LEN S _ F ACING Ċ import Ġandroidx . camera . integration . extensions . validation . Camera Validation Result Activity . Companion . get Lens Facing String From Int Ċ import Ġandroidx . camera . integration . extensions . validation . Test Results . Companion . INVALID _ EXTENSION _ MODE Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . camera . view . Preview View Ċ import Ġandroidx . concurrent . futures . await Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . math . Math Utils Ċ import Ġandroidx . core . net . to Uri Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġcom . google . common . util . concurrent . Future Callback Ċ import Ġcom . google . common . util . concurrent . F utures Ċ import Ġcom . google . common . util . concurrent . List enable Future Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ Ċ private Ġconst Ġval ĠTAG Ġ= Ġ" Image Capture Activity " Ċ Ċ class ĠImage Capture Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġextension Mode Ġ= ĠINVALID _ EXTENSION _ MODE ĊĠĠĠ Ġprivate Ġvar Ġextension Enabled Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġval Ġresult Ġ= ĠIntent () ĊĠĠĠ Ġprivate Ġvar Ġlens Facing Ġ= ĠINVALID _ LEN S _ F ACING ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Provider : ĠProcess Camera Provider ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġextensions Manager : ĠExtensions Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Id : ĠString ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Finder : ĠPreview View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġimage Capture : ĠImage Capture ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera : ĠCamera ĊĠĠĠ Ġprivate Ġvar Ġflash Mode Ġ= ĠFL ASH _ MODE _ OFF ĊĠĠĠ Ġprivate Ġvar Ġev Toast : ĠToast ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġev Future Callback : ĠFuture Callback < Int ?> Ġ= Ġobject Ġ: ĠFuture Callback < Int ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġev Ġ= Ġresult !! Ġ* Ġcamera . camera Info . ex posure State . ex posure Comp ensation Step . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" success Ġnew ĠEV : Ġ$ ev ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow EV Toast ( String . format (" EV : Ġ%. 2 f ", Ġev )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" failed Ġ$ t ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . image _ capture _ activity ) ĊĊĠĠĠĠĠĠĠ Ġcamera Id Ġ= Ġintent ?. getString Extra ( INT ENT _ EXTRA _ KEY _ CAMERA _ ID ) !! ĊĠĠĠĠĠĠĠ Ġlens Facing Ġ= Ġintent . getInt Extra ( INT ENT _ EXTRA _ KEY _ LEN S _ F ACING , ĠINVALID _ LEN S _ F ACING ) ĊĠĠĠĠĠĠĠ Ġextension Mode Ġ= Ġintent . getInt Extra ( INT ENT _ EXTRA _ KEY _ EXTENSION _ MODE , ĠINVALID _ EXTENSION _ MODE ) ĊĊĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ EXTENSION _ MODE , Ġextension Mode ) ĊĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ ERROR _ CODE , ĠERROR _ CODE _ NONE ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Code Ġ= Ġintent . getInt Extra ( INT ENT _ EXTRA _ KEY _ REQUEST _ CODE , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġset Result ( request Code , Ġresult ) ĊĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= Ġ"${ resources . getString ( R . string . extensions _ validator )}" ĊĠĠĠĠĠĠĠ Ġsupport ActionBar !!. subtitle Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Camera Ġ$ camera Id Ġ[ ${ get Lens Facing String From Int ( lens Facing )} ]" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ${ getExtension Mode String From Id ( extension Mode )} ]" ĊĊĠĠĠĠĠĠĠ Ġview Finder Ġ= ĠfindViewById ( R . id . view _ finder ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Use Cases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Ui Controls () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġoverride Ġfun Ġon Configuration Changed ( new Config : ĠConfiguration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Configuration Changed ( new Config ) ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Use Cases () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Provider Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Camera Provider . getInstance ( this ). await () ĊĠĠĠĠĠĠĠ Ġextensions Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtensions Manager . getInstance Async ( this , Ġcamera Provider ). await () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Wrong Constant ") ĊĠĠĠ Ġprivate Ġfun Ġbind Use Cases () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Selector ById Ġ= Ġcreate Camera Selector ById ( camera Id ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! extensions Manager . is Extension Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Selector ById , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension Mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ ERROR _ CODE , ĠERROR _ CODE _ EXTENSION _ MODE _ NOT _ SUPPORT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġextension Camera Selector Ġ= Ġextensions Manager . getExtension Enabled Camera Selector ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Selector ById , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Mode ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġimage Capture Ġ= ĠImage Capture . Builder (). set Flash Mode ( flash Mode ). build () ĊĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= ĠPreview . Builder (). build () ĊĠĠĠĠĠĠĠ Ġpreview . set Surface Provider ( view Finder . surface Provider ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġcamera Provider . bind To Lifecycle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extension Enabled ) Ġextension Camera Selector Ġelse Ġcamera Selector ById , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Extension Ġmode Ġis Ġ$ extension Mode Ġ( enabled : Ġ$ extension Enabled )") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ ERROR _ CODE , ĠERROR _ CODE _ BIND _ FAIL ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġbind Ġuse Ġcases Ġwith Ġ${ getExtension Mode String From Id ( extension Mode )}" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Ui Controls () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġflash Ġtoggle Ġbutton ĊĠĠĠĠĠĠĠ ĠsetUp Flash Button () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe ĠEV Ġ+ /- Ġbuttons ĊĠĠĠĠĠĠĠ ĠsetUp Ev Buttons () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġtap - to - focus Ġfunctions Ġand Ġzoom Ġin / out Ġby ĠGest ure Detector ĊĠĠĠĠĠĠĠ Ġsetup View Finder Gesture Controls () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġextension Ġmode Ġenabled / disabled Ġtoggle Ġbutton ĊĠĠĠĠĠĠĠ ĠsetUp Extension ToggleButton () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSets Ġup Ġthe Ġcapture Ġbutton ĊĠĠĠĠĠĠĠ Ġval Ġcapture Button : ĠImage Button Ġ= ĠfindViewById ( R . id . camera _ capture _ button ) ĊĊĠĠĠĠĠĠĠ Ġcapture Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Button . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture . take Picture ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( this ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠImage Capture . On Image Capt ured Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Success ( image : ĠImage Proxy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Prefix Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ Camera -$ camera Id ][ ${ get Lens Facing String From Int ( lens Facing )} ]" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"[ ${ getExtension Mode String From Id ( extension Mode )} ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġif Ġ( extension Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ filename Prefix [ Enabled ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ filename Prefix [ Disabled ]" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= ĠFile . create TempFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfilename , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Cache Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= ĠFileOutputStream ( temp File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= Ġj peg Image To J peg ByteArray ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( byteArray ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ IMAGE _ URI , Ġtemp File . to Uri ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . putExtra ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠINTENT _ EXTRA _ KEY _ IMAGE _ ROT ATION _ DE GRE ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . image Info . rotation Degrees ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( exception : ĠImage Capture Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . putExtra ( INT ENT _ EXTRA _ KEY _ ERROR _ CODE , ĠERROR _ CODE _ TA KE _ PI CTURE _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Flash Button () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Flash Button Resource () ĊĊĠĠĠĠĠĠĠ Ġval Ġflash ToggleButton : ĠImage Button Ġ= ĠfindViewById ( R . id . flash _ toggle ) ĊĊĠĠĠĠĠĠĠ Ġflash ToggleButton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflash Mode Ġ= Ġwhen Ġ( flash Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ ON Ġ-> ĠFL ASH _ MODE _ OFF ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ OFF Ġ-> ĠFL ASH _ MODE _ AUTO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ AUTO Ġ-> ĠFL ASH _ MODE _ ON ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġflash Ġmode !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture . flash Mode Ġ= Ġflash Mode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Flash Button Resource () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Flash Button Resource () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġflash ToggleButton : ĠImage Button Ġ= ĠfindViewById ( R . id . flash _ toggle ) ĊĊĠĠĠĠĠĠĠ Ġflash ToggleButton . setImage Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( flash Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ ON Ġ-> ĠR . drawable . ic _ flash _ on ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ OFF Ġ-> ĠR . drawable . ic _ flash _ off ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFL ASH _ MODE _ AUTO Ġ-> ĠR . drawable . ic _ flash _ auto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġflash Ġmode !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Ev Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplus Ev Button : ĠButton Ġ= ĠfindViewById ( R . id . plus _ ev _ button ) ĊĠĠĠĠĠĠĠ Ġplus Ev Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplus Ev () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdec Ev Button : ĠButton Ġ= ĠfindViewById ( R . id . dec _ ev _ button ) ĊĠĠĠĠĠĠĠ Ġdec Ev Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdec Ev () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplus Ev () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġcamera . camera Info . ex posure State . ex posure Comp ensation Range ĊĠĠĠĠĠĠĠ Ġval Ġec Ġ= Ġcamera . camera Info . ex posure State . ex posure Comp ensation Index ĊĊĠĠĠĠĠĠĠ Ġif Ġ( range . contains ( ec Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture : ĠList enable Future < Int > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . camera Control . set Exposure Comp ensation Index ( ec Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF utures . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture , Ġev Future Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . main Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow EV Toast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" EV : Ġ%. 2 f ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . upper Ġ* Ġcamera . camera Info . ex posure State . ex posure Comp ensation Step . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdec Ev () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġcamera . camera Info . ex posure State . ex posure Comp ensation Range ĊĠĠĠĠĠĠĠ Ġval Ġec Ġ= Ġcamera . camera Info . ex posure State . ex posure Comp ensation Index ĊĊĠĠĠĠĠĠĠ Ġif Ġ( range . contains ( ec Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfuture : ĠList enable Future < Int > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . camera Control . set Exposure Comp ensation Index ( ec Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF utures . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfuture , Ġev Future Callback , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . main Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow EV Toast ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" EV : Ġ%. 2 f ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . lower Ġ* Ġcamera . camera Info . ex posure State . ex posure Comp ensation Step . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġshow EV Toast ( message : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġev Toast ?. cancel () ĊĠĠĠĠĠĠĠ Ġev Toast Ġ= ĠToast . makeText ( application Context , Ġmessage , ĠToast . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠ Ġev Toast ?. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup View Finder Gesture Controls () Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠonTap Gesture Listener : ĠGest ure Detector . On Gesture Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSimple On Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Single Tap Up ( e : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory : ĠMet ering Point Factory Ġ= ĠDisplay Oriented Met ering Point Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . getDisplay (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . get Camera Info (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . getWidth (). toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Finder . getHeight (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠFocus Met ering Action . Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfactory . create Point ( e . x , Ġe . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF utures . add Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera . get Camera Control (). start Focus And Met ering ( action ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFuture Callback < Focus Met ering Result ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠFocus Met ering Result ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Focus Ġand Ġmeter ing Ġsucceeded .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Focus Ġand Ġmeter ing Ġfailed .", Ġt ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera X Executors . main Thread Executor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġscale Gesture Listener : ĠSimple On Scale Gesture Listener Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠSimple On Scale Gesture Listener () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scale ( detector : ĠScale Gesture Detector ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Info : ĠCamera Info Ġ= Ġcamera . get Camera Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Zoom Ġ= Ġ( camera Info . zoom State . value !!. zoom Ratio ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġdetector . scale Factor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Zoom Ratio ( new Zoom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtap Gesture Detector Ġ= ĠGest ure Detector ( this , ĠonTap Gesture Listener ) ĊĠĠĠĠĠĠĠ Ġval Ġscale Detector Ġ= ĠScale Gesture Detector ( this , Ġscale Gesture Listener ) ĊĠĠĠĠĠĠĠ Ġview Finder . setOn Touch Listener Ġ{ Ġ_, Ġe : ĠMotion Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtap Event Processed Ġ= Ġtap Gesture Detector . on Touch Event ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscale Event Processed Ġ= Ġscale Detector . on Touch Event ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtap Event Processed Ġ|| Ġscale Event Processed ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġset Zoom Ratio ( new Zoom : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Info : ĠCamera Info Ġ= Ġcamera . get Camera Info () ĊĠĠĠĠĠĠĠ Ġval Ġcamera Control : ĠCamera Control Ġ= Ġcamera . get Camera Control () ĊĠĠĠĠĠĠĠ Ġval Ġclamp ed New Zoom Ġ= ĠMath Utils . clamp ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Zoom , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Info . zoom State . value !!. min Zoom Ratio , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Info . zoom State . value !!. max Zoom Ratio ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Zoom Ratio Ġratio : Ġ$ clamp ed New Zoom ") ĊĠĠĠĠĠĠĠ Ġval Ġlist enable Future Ġ= Ġcamera Control . set Zoom Ratio ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclamp ed New Zoom ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠF utures . add Callback ( list enable Future , Ġobject Ġ: ĠFuture Callback < Void ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( result : ĠVoid ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Zoom Ratio ĠonSuccess : Ġ$ clamp ed New Zoom ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" set Zoom Ratio Ġfailed , Ġ$ t ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Extension ToggleButton () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension ToggleButton : ĠImage Button Ġ= ĠfindViewById ( R . id . extension _ toggle ) ĊĠĠĠĠĠĠĠ Ġset Extension ToggleButton Resource () ĊĊĠĠĠĠĠĠĠ Ġextension ToggleButton . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Enabled Ġ= Ġ! extension Enabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Extension ToggleButton Resource () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbind Use Cases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Ui Controls () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extension Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Effect Ġis Ġenabled !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Effect Ġis Ġdisabled !", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Extension ToggleButton Resource () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension ToggleButton : ĠImage Button Ġ= ĠfindViewById ( R . id . extension _ toggle ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! extension Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension ToggleButton . setImage Resource ( R . drawable . outline _ block ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresource Id Ġ= Ġwhen Ġ( extension Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Mode . HDR Ġ-> ĠR . drawable . outline _ hdr _ on ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Mode . BO KE H Ġ-> ĠR . drawable . outline _ portrait ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Mode . N IGHT Ġ-> ĠR . drawable . outline _ bed time ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Mode . FACE _ RE TO UCH Ġ-> ĠR . drawable . outline _ face _ re touch ing _ natural ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtension Mode . AUTO Ġ-> ĠR . drawable . outline _ auto _ awesome ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Invalid Ġextension Ġmode !") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġextension ToggleButton . setImage Resource ( resourceId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts ĠJPEG Ġ[ Image Proxy ] Ġto ĠJPEG Ġbyte Ġarray . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġj peg Image To J peg ByteArray ( image : ĠImage Proxy ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( image . format Ġ== ĠImage Format . JPEG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Incorrect Ġimage Ġformat Ġof Ġthe Ġinput Ġimage Ġproxy : Ġ${ image . format }" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġplanes Ġ= Ġimage . planes ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġplanes [ 0 ]. buffer ĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠByteArray ( buffer . capacity ()) ĊĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠ Ġbuffer [ data ] ĊĠĠĠĠĠĠĠ Ġreturn Ġdata ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ NONE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ BIND _ FAIL Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ EXTENSION _ MODE _ NOT _ SUPPORT Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠERROR _ CODE _ TA KE _ PI CTURE _ FAILED Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ } Ċ