package Ġcom . example . barcode scanner Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . media . MediaPlayer Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Sparse Array Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Surface Holder Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . core . util . isNotEmpty Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . example . barcode scanner . data . Item Ċ import Ġcom . example . barcode scanner . data . Item Database Ċ import Ġcom . example . barcode scanner . data . Item Database Dao Ċ import Ġcom . example . barcode scanner . settings . Preference Util Ċ import Ġcom . example . barcode scanner . utilities . TAG Ċ import Ġcom . example . barcode scanner . utilities . Util Tools Ċ Ċ import Ġcom . google . android . gms . vision . Camera Source Ċ import Ġcom . google . android . gms . vision . Detector Ċ import Ġcom . google . android . gms . vision . barcode . Barcode Ċ import Ġcom . google . android . gms . vision . barcode . Barcode Detector ĊĊ Ċ import Ġhandle Permissions Result Ċ import Ġkotlinx . android . synt hetic . main . fragment _ scanner .* Ċ import Ġkotlinx . android . synt hetic . main . scanner _ action _ bar .* Ċ import Ġjava . text . Decimal Format Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġ[ Fragment ] Ġsubclass Ġas Ġthe Ġsecond Ġdestination Ġin Ġthe Ġnavigation . Ċ Ġ*/ Ċ class ĠScanner Fragment Ġ: ĠFragment (), ĠView . OnClickListener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Source : ĠCamera Source ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdetector : ĠBar code Detector ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠItem Database Dao ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġitem : ĠItem ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ scanner , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠItem Database . getInstance ( require Context ()). item Database Dao ĊĊĠĠĠĠĠĠĠ Ġ// Ġitem Ġ= ĠItem ( null ," error ", null , null , null , null , null , null , null , null ) ĊĊĠĠĠĠĠĠĠ Ġ/* Ġhandle Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Permission . CAMERA , ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Granted Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Detector () ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Denied Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( App Permission . CAMERA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġon R ationale Needed Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ) */ ĊĠĠĠĠĠĠĠĠ Ġwhile Ġ(! Util Tools . all Permissions Granted ( require Context ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtil Tools . request Runtime Permissions ( require Activity ()) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠsetUp Detector () ĊĠĠĠĠĠĠĠ Ġcamera _ surface _ view . visibility Ġ= ĠView . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġbutton _ details . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġflash _ button . setOnClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Detector () Ġ{ ĊĠĠĠĠĠĠĠ Ġdetector Ġ= ĠBar code Detector . Builder ( require Activity ()). set Barcode Formats ( Barcode . ALL _ FORMAT S ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġcamera Source Ġ= ĠCamera Source . Builder ( require Activity (), Ġdetector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Focus Enabled ( true ). build () ĊĠĠĠĠĠĠĠ Ġcamera _ surface _ view . holder . add Callback ( surface Callback ) ĊĠĠĠĠĠĠĠ Ġdetector . set Processor ( processor ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġcallback Ġfor Ġcamera Ġsurface ĊĠĠĠ Ġprivate Ġval Ġ Ġsurface Callback Ġ= Ġobject Ġ: ĠSurface Holder . Callback { ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Changed ( holder : ĠSurface Holder ?, Ġformat : ĠInt , Ġwidth : ĠInt , Ġheight : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Destroyed ( holder : ĠSurface Holder ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsurface Created ( holder : ĠSurface Holder ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Source . start ( holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( exception Ġ: ĠSecurity Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context ," something Ġwent Ġwrong ...", Toast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// Ġprocessor Ġfor Ġbarcode Ġdetector ĊĠĠĠ Ġprivate Ġval Ġprocessor Ġ= Ġobject Ġ: ĠDetector . Processor < Barcode >{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlast Barcode : ĠString Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrelease () Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġreceive Det e ctions ( detection s : ĠDetector . Det e ctions < Barcode > ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( detection s Ġ!= Ġnull Ġ&& Ġdetection s . detected Items . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbar codes : ĠSparse Array < Barcode > Ġ= Ġdetection s . detected Items ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbarcode Ġ= Ġbar codes . value At ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Barcode Ġ== Ġbarcode . raw Value ) Ġreturn Ġ// Ġsame Ġbarcode Ġ- Ġignore ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Barcode Ġ= Ġbarcode . raw Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Value : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( barcode . raw Value . startsWith (" ] C 1 ")) Ġbarcode . raw Value . substring ( 3 ) Ġelse Ġbarcode . raw Value . trim Start ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' 0 ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Util . is V ibration Enabled ( require Context ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtil Tools . vi br ate ( activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Preference Util . is Sound Enabled ( require Context ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Player . create ( require Context (), ĠR . raw . barcode _ be ep ). start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem List : ĠList < Item > Ġ= Ġif Ġ( database . getItem Barcode 2 ( raw Value ). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . getItem Barcode 1 ( raw Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase . getItem Barcode 2 ( raw Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem : ĠItem ? Ġ= Ġif Ġ( item List . isEmpty ()) Ġnull Ġelse Ġitem List [ 0 ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Info Ui ( item , Ġraw Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Info Ui ( item : ĠItem ?, Ġraw Value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Activity (). run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode _ scanner _ item _ info . text Ġ= Ġraw Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider _ code _ name . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname _ scanner _ item _ info . text Ġ= Ġresources . getString ( R . string . item _ not _ found ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdivider _ name _ price . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprice _ scanner _ item _ info . text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinventory _ scanner _ item _ info . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ details . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis @ Scanner Fragment . item Ġ= Ġitem ĊĠĠĠĠĠĠĠ Ġrequire Activity (). run On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode _ scanner _ item _ info . text Ġ= Ġraw Value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider _ code _ name . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname _ scanner _ item _ info . text Ġ= Ġitem . name ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ"${ name _ scanner _ item _ info . text }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdivider _ name _ price . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprice _ scanner _ item _ info . text Ġ= Ġresources . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . price _ item _ scanner _ info , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDecimal Format (" 0 . 0 0 "). format ( item . price ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinventory _ scanner _ item _ info . text Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getString ( R . string . inventory _ info , Ġdatabase . get Inventory ( item . code , Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinventory _ scanner _ item _ info . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton _ details . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġtake Ġcare Ġof Ġcamera Ġpermission ĊĠĠĠ Ġ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 ) ĊĊĊĠĠĠĠĠĠĠ Ġhandle Permissions Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Code , Ġpermissions , Ġgrant Results , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permission Granted Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetUp Detector () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera _ surface _ view . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Dialog (" ×Ĺ × ĸ ×ķ× ¨ Ġ×Ĳ ×Ĺ ×ķ× ¨ ×Ķ Ġ×ķ ×© ×ķ× ĳ Ġ×ľ ×Ĺ × ¥ Ġ×¢ ×ľ Ġ× ¡ ×¨ ×ķ× § ( ×¨ ×§ Ġ×ĳ ×¤ ×¢ ×Ŀ Ġ×Ķ ×¨ ×Ĳ ×© ×ķ× ł ×Ķ ...) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permission Denied Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Dialog (" ×ł ×ĵ ×¨ ×© ×ª Ġ× Ĵ ×Ļ× © ×Ķ Ġ×ľ ×ŀ ×¦ ×ľ ×ŀ ×Ķ Ġ×Ľ ×ĵ ×Ļ Ġ×ľ × ¡ ×¨ ×ķ× § Ġ×ĳ ×¨ ×§ ×ķ× ĵ ×Ļ×Ŀ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Permission Denied Per manently Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Dialog (" ×ľ ×ľ ×Ĳ Ġ×ŀ ×¦ ×ľ ×ŀ ×Ķ Ġ×ľ ×Ĳ Ġ× ł ×ķ× Ľ ×ľ Ġ×ľ × ¡ ×¨ ×ķ× § Ġ×ĳ ×¨ ×§ ×ķ× ĵ ×Ļ×Ŀ ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Dialog ( msg : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage ( msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button (" OK ") Ġ{ Ġdialog , Ġ_ Ġ-> Ġdialog . dismiss () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create (). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ ĠR . id . close _ button Ġ-> Ġfind Nav Controller (). navigate Up () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . flash _ button Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflash _ button . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isSelected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtil Tools . turn Off Flash Light ( camera Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtil Tools . turn On Flash Light ( camera Source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . button _ details Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" button Ġclicked ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġitem . name Ġ?: Ġ" no Ġname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠScanner Bottom Sheet ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show ( parent FragmentManager , ĠTAG ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġflash _ button . isSelected Ġ= Ġfalse ĊĠĠĠ Ġ} Ċ }