package Ġcom . p unk studio . scanner Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . media . Audio Manager Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Message Ċ import Ġandroid . os . V ibr ator Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . View Ċ import Ġandroid . view . Window Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . google . zx ing . Result Ċ import Ġcom . p unk studio . scanner . camera . Camera Manager . Companion . get Ċ import Ġcom . p unk studio . scanner . camera . Camera Manager . Companion . init Ċ import Ġcom . p unk studio . scanner . decode .* Ċ import Ġcom . p unk studio . scanner . decode . Decode Manager . On Refresh Camera Listener Ċ import Ġkotlinx . android . synt hetic . main . activity _ qr _ code .* Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . Executor Ċ import Ġjava . util . concurrent . Executors Ċ Ċ /** Ċ Ġ* Ġ@ author ĠM ason Ċ Ġ* Ċ Ġ* Ġ@ date Ġ 2 0 1 9 - 0 3 - 0 5 Ċ Ġ*/ Ċ class ĠScanner Activity Ġ: ĠAppCompatActivity (), ĠSurface Holder . Callback , ĊĠĠĠ ĠView . OnClickListener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Capture Activity Handler : ĠCapture Activity Handler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Has Surface Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Permission Ok Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm In activity Timer : ĠIn activity Timer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġm Decode Manager Ġ= ĠDecode Manager () ĊĠĠĠ Ġprivate Ġvar Ġm MediaPlayer : ĠMedia Player ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Play Be ep Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm V ibrate Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġm Need Flash Light Open Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġm Qr Code Executor : ĠExecutor ? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Window Feature ( Window . FEATURE _ NO _ TITLE ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ qr _ code ) ĊĠĠĠĠĠĠĠ Ġinit View () ĊĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhas Hardware Ġ= Ġcheck Camera Hard Ware ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( has Hardware ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Camera Permission ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr Code Bg . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr Finder . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Permission Ok Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Permission Ok Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Permission Ok Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Has Surface Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġqr Light . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġqr Picture . setOnClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( this ) ĊĠĠĠĠĠĠĠ Ġm In activity Timer Ġ= ĠIn activity Timer ( this @ Scanner Activity ) ĊĠĠĠĠĠĠĠ Ġm Qr Code Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhas Camera Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpm Ġ= Ġpackage Manager ĊĠĠĠĠĠĠĠ Ġreturn ĠPackage Manager . PERMISSION _ GRAN TED Ġ== Ġpm . check Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" android . permission . CAMERA ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġcheck Permission () ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Permission Ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Permission Denied Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsurface Holder Ġ= Ġqr Preview . holder ĊĠĠĠĠĠĠĠ Ġturn Flash Light Off () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Has Surface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Camera ( surface Holder ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Holder . add Callback ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsurface Holder . setType ( Surface Holder . SURFACE _ TYPE _ PUSH _ BUFFER S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Play Be ep Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġaudio Service Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( audio Service . ring er Mode Ġ!= ĠAudio Manager . RING ER _ MODE _ NORMAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Play Be ep Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Be ep Sound () ĊĠĠĠĠĠĠĠ Ġm V ibrate Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Capture Activity Handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Activity Handler !!. quit S ynchronously () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Activity Handler Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġget () !!. close Driver () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġm In activity Timer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm In activity Timer !!. shutdown () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Decode ( result : ĠResult ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm In activity Timer !!. on Activity () ĊĠĠĠĠĠĠĠ Ġplay Be ep Sound And V ibrate () ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġresult ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Could Not Read Qr Code From Scanner ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Refresh Camera Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult String Ġ= Ġresult . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Result ( result String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Camera ( surface Holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () !!. open Driver ( surface Holder ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( R . string . qr _ code _ camera _ not _ found ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( re : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Permission Denied Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġqr Finder . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġqr Preview . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġqr Light Ll . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġqr Code Bg . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġif Ġ( m Capture Activity Handler Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Activity Handler Ġ= ĠCapture Activity Handler ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestart Preview () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġm Capture Activity Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Capture Activity Handler !!. restart Preview And Decode () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Changed ( ĊĠĠĠĠĠĠĠ Ġholder : ĠSurface Holder , ĊĠĠĠĠĠĠĠ Ġformat : ĠInt , ĊĠĠĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Camera Hard Ware ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Manager Ġ= Ġcontext . package Manager ĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Manager . has System Feature ( PackageManager . FEATURE _ CAMERA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Created ( holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Has Surface ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Has Surface Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Camera ( holder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( holder : ĠSurface Holder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Has Surface Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcapture Activity Handler : ĠHandler ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġm Capture Activity Handler ĊĊĠĠĠ Ġprivate Ġfun Ġinit Be ep Sound () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Play Be ep Ġ&& Ġm MediaPlayer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvolume Control Stream Ġ= ĠAudio Manager . STREAM _ M US IC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= ĠMedia Player () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. set Audio Stream Type ( Audio Manager . STREAM _ M US IC ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. setOn Completion Listener ( m Be ep Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . open Raw Resource Fd ( R . raw . be ep ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. set DataSource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . file Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. set Volume ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB EE P _ VOLUME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB EE P _ VOLUME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. prepare () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġplay Be ep Sound And V ibrate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Play Be ep Ġ&& Ġm MediaPlayer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm MediaPlayer !!. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( mV ibrate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvi br ator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget System Service ( Context . V IB R ATOR _ SERVICE ) Ġas ĠV ibr ator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvi br ator . vi br ate ( V IB RATE _ DURATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġbe ep Ġhas Ġfinished Ġplaying , Ġre wind Ġto Ġqueue Ġup Ġanother Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġm Be ep Listener Ġ= ĊĠĠĠĠĠĠĠ ĠMedia Player . On Completion Listener Ġ{ Ġmedia Player Ġ-> Ġmedia Player . seek To ( 0 ) Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( v . id Ġ== ĠR . id . qr Light ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Need Flash Light Open ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Flash light On () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġturn Flash Light Off () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( v . id Ġ== ĠR . id . qr Picture ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Camera Permission ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Permission Denied Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen System Album () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen System Album () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠ Ġintent . action Ġ= ĠIntent . ACTION _ GET _ CONTENT ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠREQUEST _ SYSTEM _ PI CTURE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġturn Flash light On () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Need Flash Light Open Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġqr Light Text . text Ġ= ĠgetString ( R . string . qr _ code _ close _ flash _ light ) ĊĠĠĠĠĠĠĠ Ġqr Light . setBackground Resource ( R . drawable . flash light _ turn _ off ) ĊĠĠĠĠĠĠĠ Ġget () !!. set Flash Light ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġturn Flash Light Off () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Need Flash Light Open Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġqr Light Text . text Ġ= ĠgetString ( R . string . qr _ code _ open _ flash _ light ) ĊĠĠĠĠĠĠĠ Ġqr Light . setBackground Resource ( R . drawable . flash light _ turn _ on ) ĊĠĠĠĠĠĠĠ Ġget () !!. set Flash Light ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Result ( result String : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( result String )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Could Not Read Qr Code From Scanner ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠOn Refresh Camera Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestart Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Got Ġscan Ġresult Ġfrom Ġuser Ġloaded Ġimage Ġ: $ result String ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . putExtra ( SCAN _ RESULT , Ġresult String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ OK , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ!= ĠRESULT _ OK Ġ|| Ġdata Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ PI CTURE Ġ-> Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ SYSTEM _ PI CTURE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Path Ġ= ĠgetPath From Uri ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( img Path ) Ġ&& Ġnull Ġ!= Ġm Qr Code Executor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Qr Code Executor !!. execute ( Decode Image Thread ( img Path , Ġm Decode Image Callback )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetPath From Uri ( uri : ĠUri ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . query ( uri !! , Ġnull , Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġcursor !!. moveTo First () ĊĠĠĠĠĠĠĠ Ġvar Ġdocument Id Ġ= Ġcursor . getString ( 0 ) ĊĠĠĠĠĠĠĠ Ġdocument Id Ġ= Ġdocument Id . substring ( document Id . lastIndexOf (": ") Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcontent Resolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media ._ ID Ġ+ Ġ" Ġ= Ġ? Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( document Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcursor !!. moveTo First () ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Media Store . Images . Media . DATA )) ĊĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġpath ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Decode Image Callback : ĠDecode Image Callback Ġ= Ġobject Ġ: ĠDecode Image Callback Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecode Suc ceed ( result : ĠResult ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Decoded Ġthe Ġimage Ġsuccessfully Ġ:" Ġ+ Ġresult !!. text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . putExtra ( SCAN _ RESULT , Ġresult . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ OK , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecode Fail ( type : ĠInt , Ġreason : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Something Ġwent Ġwrong Ġdecoding Ġthe Ġimage Ġ: $ reason ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . putExtra ( SCAN _ DE CODING _ IMAGE _ ERROR , Ġreason ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ C ANCE LED , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠWeak Handler ( image Picker Activity : ĠScanner Activity ) Ġ: ĊĠĠĠĠĠĠĠ ĠHandler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Weak Scanner Activity : ĠWeak Reference < Scanner Activity > Ġ= ĠWeak Reference ( image Picker Activity ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġm Decode Manager Ġ= ĠDecode Manager () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqr Code Activity Ġ= Ġm Weak Scanner Activity . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ DECODE _ SU CCE ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmsg . obj Ġas ĠResult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġresult ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Could Not Read Qr Code From Picture ( qr Code Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult String Ġ= Ġresult . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Result ( result String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMSG _ DECODE _ FAIL Ġ-> Ġm Decode Manager . show Could Not Read Qr Code From Picture ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqr Code Activity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . handle Message ( msg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Result ( result String : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Picker Activity Ġ= Ġm Weak Scanner Activity . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Decode Manager . show Result Dialog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Picker Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult String , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġwhich Ġ-> Ġdialog . dismiss () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ SYSTEM _ PI CTURE Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ PI CTURE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMSG _ DECODE _ SU CCE ED Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMSG _ DECODE _ FAIL Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠB EE P _ VOLUME Ġ= Ġ 0 . 1 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠV IB RATE _ DURATION Ġ= Ġ 2 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= ĠScanner Activity :: class . java . simple Name ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠScanner Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }