/* Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 , ĠSales force . com , Ġinc . Ċ Ġ* ĠAll Ġrights Ġreserved . Ċ Ġ* ĠSPDX - License - Identifier : ĠBSD - 3 - Clause Ċ Ġ* ĠFor Ġfull Ġlicense Ġtext , Ġsee Ġthe ĠLICENSE Ġfile Ġin Ġthe Ġrepo Ġroot Ġor Ġhttps :// opensource . org / licenses / BSD - 3 - Clause Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġcom . sales force . barcode scanner plugin Ċ Ċ import Ġandroid . animation . Animator Inflater Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Providers Ċ import Ġcom . google . android . material . chip . Chip Ċ import Ġcom . google . firebase . ml . vision . barcode . Firebase Vision Barcode Detector Options Ċ import Ġcom . sales force . barcode scanner plugin . barcode detection . Barcode Processor Ċ import Ġcom . sales force . barcode scanner plugin . barcode detection . Barcode Sc anned Event Ċ import Ġcom . sales force . barcode scanner plugin . camera . Camera Source Ċ import Ġcom . sales force . barcode scanner plugin . camera . Camera Source Preview Ċ import Ġcom . sales force . barcode scanner plugin . camera . Graphic Overlay Ċ import Ġcom . sales force . barcode scanner plugin . camera . Workflow Model Ċ import Ġcom . sales force . barcode scanner plugin . camera . Workflow Model . Workflow State Ċ import Ġkotlinx . android . synt hetic . main . top _ action _ bar _ in _ live _ camera .* Ċ import Ġorg . green robot . event bus . EventBus Ċ import Ġjava . io . IOException Ċ Ċ /** ĠD emon str ates Ġthe Ġbarcode Ġscanning Ġworkflow Ġusing Ġcamera Ġpreview . Ġ Ġ*/ Ċ class ĠLive Barcode Sc anning Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġcamera Source : ĠCamera Source ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpreview : ĠCamera Source Preview ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġgraphic Overlay : ĠGraph ic Overlay ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġprompt Chip : ĠCh ip ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġprompt Chip Animator : ĠAn imator Set ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġworkflow Model : ĠWorkflow Model ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent Workflow State : ĠWorkflow State ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbarcode Detector Options : ĠFirebase Vision Barcode Detector Options ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Utils . are Permissions Granted ( this )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! Utils . are Permissions Granted ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . request Permissions ( this ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Camera () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinitialize Camera (){ ĊĠĠĠĠĠĠĠ Ġval Ġbarcode Scanner Options Ġ= Ġintent . extras ?. get Serializable ( OPTIONS _ VALUE ) Ġas ĠBar code Scanner Options ? ĊĠĠĠĠĠĠĠ Ġif Ġ( barcode Scanner Options Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcombined Type Ġ= Ġbarcode Scanner Options . barcode Types . fold ( 0 ) Ġ{ Ġsum , Ġbarcode Type Ġ-> Ġsum Ġor Ġbarcode Type . to Vision Barcode Type () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbarcode Detector Options Ġ= ĠFirebase Vision Barcode Detector Options . Builder (). set Barcode Formats ( combined Type ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ live _ barcode ) ĊĠĠĠĠĠĠĠ Ġpreview Ġ= ĠfindViewById ( R . id . camera _ preview ) ĊĠĠĠĠĠĠĠ Ġgraphic Overlay Ġ= ĠfindViewById < Graphic Overlay >( R . id . camera _ preview _ graphic _ overlay ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source Ġ= ĠCamera Source ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprompt Chip Ġ= ĠfindViewById ( R . id . bottom _ prompt _ chip ) ĊĠĠĠĠĠĠĠ Ġprompt Chip Animator Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( Animator Inflater . load Animator ( this , ĠR . anim ator . bottom _ prompt _ chip _ enter ) Ġas ĠAn imator Set ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Target ( prompt Chip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclose _ button . setOnClickListener Ġ{ Ġon Back Pressed () Ġ} ĊĊĠĠĠĠĠĠĠ ĠsetUp Workflow Model () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĊĠĠĠĠĠĠĠ Ġworkflow Model ?. mark Camera Frozen () ĊĠĠĠĠĠĠĠ Ġcurrent Workflow State Ġ= ĠWorkflow State . NOT _ STARTED ĊĠĠĠĠĠĠĠ Ġcamera Source ?. set Frame Processor ( Barcode Processor ( graphic Overlay !! , Ġworkflow Model !! , Ġbarcode Detector Options )) ĊĠĠĠĠĠĠĠ Ġworkflow Model ?. set Workflow State ( Workflow State . DETECT ING ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ Ġcurrent Workflow State Ġ= ĠWorkflow State . NOT _ STARTED ĊĠĠĠĠĠĠĠ Ġstop Camera Preview () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġcamera Source ?. release () ĊĠĠĠĠĠĠĠ Ġcamera Source Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Camera Preview () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworkflow Model Ġ= Ġthis . workflow Model Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcamera Source Ġ= Ġthis . camera Source Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! workflow Model . is Camera Live ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Model . mark Camera Live () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ?. start ( camera Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . camera Source Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . post Error ( TAG , Ġ" Failed Ġto Ġstart Ġcamera Ġpreview !", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Camera Preview () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworkflow Model Ġ= Ġthis . workflow Model Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( workflow Model . is Camera Live ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Model . mark Camera Frozen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ?. stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Workflow Model () Ġ{ ĊĠĠĠĠĠĠĠ Ġworkflow Model Ġ= ĠViewModel Providers . of ( this ). get ( Workflow Model :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOb serves Ġthe Ġworkflow Ġstate Ġchanges , Ġif Ġhappens , Ġupdate Ġthe Ġoverlay Ġview Ġindicators Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġcamera Ġpreview Ġstate . ĊĠĠĠĠĠĠĠ Ġworkflow Model !!. workflow State . observe ( this , ĠObserver Ġ{ Ġworkflow State Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( workflow State Ġ== Ġnull Ġ|| Ġcurrent Workflow State Ġ== Ġworkflow State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Observer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Workflow State Ġ= Ġworkflow State ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Current Ġworkflow Ġstate : Ġ${ current Workflow State !!. name }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwas Prompt Chip G one Ġ= Ġprompt Chip ?. visibility Ġ== ĠView . GONE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( workflow State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWorkflow State . DETECT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Chip ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Chip ?. setText ( R . string . prompt _ point _ at _ a _ barcode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWorkflow State . DETECT ED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Chip ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Camera Preview () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġprompt Chip ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshould Play Prompt Chip Enter ing Animation Ġ= Ġwas Prompt Chip G one Ġ&& Ġprompt Chip ?. visibility Ġ== ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprompt Chip Animator ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Play Prompt Chip Enter ing Animation Ġ&& Ġ! it . isRunning ) Ġit . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġworkflow Model ?. detected Barcode ?. observe ( this , ĠObserver Ġ{ Ġbarcode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( barcode Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEvent Bus . getDefault (). post Sticky ( Barcode Sc anned Event ( Barcode Scanner Result ( Barcode Type . from Vision Barcode ( barcode . format ), Ġbarcode . display Value Ġ?: Ġ" "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . finish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Live Barcode Activity " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠOPTIONS _ VALUE Ġ= Ġ" Options Value " ĊĠĠĠ Ġ} Ċ } Ċ