package Ġorg . wallet connect . example . wallet . scanner Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . activity . result . contract . Activity Result Contracts Ċ import Ġandroidx . camera . core . Camera Selector Ċ import Ġandroidx . camera . core . Image Analysis Ċ import Ġandroidx . camera . core . Image Proxy Ċ import Ġandroidx . camera . core . Preview Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . activity ViewModels Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . google . ml kit . vision . barcode . Barcode Ċ import Ġcom . google . ml kit . vision . barcode . Barcode Scanner Ċ import Ġcom . google . ml kit . vision . barcode . Barcode Scanner Options Ċ import Ġcom . google . ml kit . vision . barcode . Barcode Sc anning Ċ import Ġcom . google . ml kit . vision . common . Input Image Ċ import Ġorg . wallet connect . example . R Ċ import Ġorg . wallet connect . example . databinding . Scanner Fragment Binding Ċ import Ġorg . wallet connect . example . wallet . Wallet ViewModel Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠScanner Fragment Ġ: ĠFragment ( R . layout . scanner _ fragment ) Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠScanner Fragment Binding ĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠWallet ViewModel Ġby Ġactivity ViewModels () ĊĠĠĠ Ġprivate Ġval Ġcamera Permission Callback Ġ= ĊĠĠĠĠĠĠĠ Ġregister For Activity Result ( Activity Result Contracts . Request Permission ()) Ġ{ Ġis Granted Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Granted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Camera Use Cases () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcamera Provider : ĠProcess Camera Provider ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcamera Selector : ĠCamera Selector ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpreview UseCase : ĠPreview ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġanalysis UseCase : ĠImage Analysis ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġshould Scan : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠScanner Fragment Binding . bind ( view ) ĊĠĠĠĠĠĠĠ Ġsetup Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Selector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . Builder (). require Lens Facing ( Camera Selector . LEN S _ F ACING _ BACK ). build () ĊĠĠĠĠĠĠĠ Ġsetup Observer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Observer () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Process Camera Provider () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. observe ( view Lifecycle Owner , Ġ{ Ġprovider : ĠProcess Camera Provider Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Camera Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind Camera Use Cases () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Permission Callback . launch ( Manifest . permission . CAMERA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Process Camera Provider (): ĠLive Data < Process Camera Provider > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider LiveData Ġ= ĠMutable LiveData < Process Camera Provider >() ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future Ġ= ĠProcess Camera Provider . getInstance ( require Activity (). application ) ĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġcamera Provider LiveData . setValue ( camera Provider Future . get ()) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( require Activity (). application ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcamera Provider LiveData ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Camera Use Cases () Ġ{ ĊĠĠĠĠĠĠĠ Ġbind Preview UseCase () ĊĠĠĠĠĠĠĠ Ġbind Analy se UseCase () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Preview UseCase () Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Provider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( preview UseCase Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unbind ( preview UseCase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview UseCase Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( binding . preview View . display . rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview UseCase ?. set Surface Provider ( binding . preview View . surface Provider ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider ?. bind To Lifecycle ( this , Ġcamera Selector !! , Ġpreview UseCase ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbind Analy se UseCase () Ġ{ ĊĠĠĠĠĠĠĠ ĠBar code Scanner Options . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Barcode Formats ( Barcode . FORMAT _ QR _ CODE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build (); ĊĠĠĠĠĠĠĠ Ġval Ġbarcode Scanner : ĠBar code Scanner Ġ= ĠBar code Sc anning . getClient () ĊĊĠĠĠĠĠĠĠ Ġcamera Provider ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( analysis UseCase Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . unbind ( analysis UseCase ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalysis UseCase Ġ= ĠImage Analysis . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Rotation ( binding . preview View . display . rotation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġanalysis UseCase ?. set Analyzer ( Executors . new Single Thread Executor (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġimage Proxy Ġ-> Ġprocess Image Proxy ( barcode Scanner , Ġimage Proxy ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider ?. bind To Lifecycle ( this , Ġcamera Selector !! , Ġanalysis UseCase ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Unsafe Opt In Usage Error ") ĊĠĠĠ Ġprivate Ġfun Ġprocess Image Proxy ( barcode Scanner : ĠBar code Scanner , Ġimage Proxy : ĠImage Proxy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput Image Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Proxy . image ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Image . from Media Image ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Proxy . image Info . rotation Degrees ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinput Image ?. let Ġ{ Ġimage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbarcode Scanner . process ( image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Success Listener Ġ{ Ġbar codes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bar codes . isNotEmpty () Ġ&& Ġshould Scan ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbar codes . first (). raw Value ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Scan Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . pair ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). pop Back Stack () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Failure Listener Ġ{ ĠLog . e (" Failure ", Ġit . message . toString ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġimage Proxy . close () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Camera Permission Granted (): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( require Context (), ĠManifest . permission . CAMERA ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPackage Manager . PERMISSION _ GRAN TED Ċ }