package Ġcom . mn hy im . s _ leaf . views . scan Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġcom . mn hy im . s _ leaf . R Ċ import Ġcom . mn hy im . s _ leaf . core . domain . model . Plant Ċ import Ġcom . mn hy im . s _ leaf . databinding . Fragment Scan Binding Ċ import Ġcom . mn hy im . s _ leaf . views . detail . Detail Activity Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . Flow Preview Ċ import Ġorg . k oin . android x . view model . ext . android . viewModel Ċ import Ġjava . io . ByteArray OutputStream Ċ Ċ @ Flow Preview Ċ @ Experimental Cor outines Api Ċ class ĠScan Fragment Ġ: ĠFragment (), ĠView . OnClickListener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar ĠTAG : ĠString Ġ= Ġthis :: class . java . simple Name ĊĊĠĠĠ Ġprivate Ġval Ġscan ViewModel : ĠScan ViewModel Ġby ĠviewModel () ĊĊĠĠĠ Ġprivate Ġvar Ġ_ scan Binding : ĠFragment Scan Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġscan Binding Ġget () Ġ= Ġ_ scan Binding !! ĊĊĠĠĠ Ġprivate Ġval ĠCAM ERA _ REQUEST : ĠInt Ġ= Ġ 2 0 0 ĊĠĠĠ Ġprivate Ġval ĠG ALL ERY _ REQUEST : ĠInt Ġ= Ġ 3 0 0 ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtaken Image : ĠBitmap ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ scan Binding Ġ= ĠFragment Scan Binding . inflate ( layout Inflater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġscan Binding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġscan Binding . img Scan Result . setImage Resource ( R . drawable . bg _ rounded _ all ) ĊĠĠĠĠĠĠĠ Ġscan Binding . btn Capture Image . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġscan Binding . btn Scan Image . setOnClickListener ( this ) ĊĠĠĠĠĠĠĠ Ġscan Binding . btn Gallery Picker . setOnClickListener ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġscan Binding . progress Bar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġscan ViewModel . scan Result . remove Observer s ( view Lifecycle Owner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( v . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ capture Image Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Image () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ scan Image Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Binding . progress Bar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscan Image ( taken Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . btn _ gallery Picker Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpick Gallery () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġrequest Code Ġ== ĠCAM ERA _ REQUEST Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtaken Image Ġ= Ġdata . extras ?. get (" data ") Ġas ĠBitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Binding . img Scan Result . setImage Bitmap ( taken Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Binding . btn Scan Image . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġrequest Code Ġ== ĠG ALL ERY _ REQUEST Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Uri : ĠUri ? Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . get Bitmap ( require Activity (). content Resolver , Ġimage Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtaken Image Ġ= Ġbitmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Binding . img Scan Result . setImage Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġscan Binding . btn Scan Image . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcapture Image () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Intent Ġ= ĠIntent ( Media Store . ACTION _ IMAGE _ CAPTURE ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( camera Intent , ĠCAM ERA _ REQUEST ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpick Gallery () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġphoto Picker Intent Ġ= ĠIntent ( Intent . ACTION _ P ICK ) ĊĠĠĠĠĠĠĠ Ġphoto Picker Intent . type Ġ= Ġ" image /* " ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( photo Picker Intent , ĠG ALL ERY _ REQUEST ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġscan Image ( image : ĠBitmap ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġimage . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġba os ) ĊĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġba os . toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġbase 6 4 img Ġ= ĠBase 6 4 . encode ToString ( b , ĠBase 6 4 . DEFAULT ) ĊĊĠĠĠĠĠĠĠ Ġscan ViewModel . set Scan Image ( base 6 4 img ) ĊĠĠĠĠĠĠĠ Ġscan ViewModel . scan Result . observe ( view Lifecycle Owner , Ġ{ Ġplant Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Dialog ( plant ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Dialog ( plant : ĠPl ant ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( context ) ĊĠĠĠĠĠĠĠ Ġwith Ġ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle (" Scan Ġcomplete !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Message (" Match Ġlevel : Ġ${ plant . score }, ĠOpen ĠDetail Ġpage ?") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Open ") Ġ{ Ġdialog , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠDetail Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Detail Activity . EXTRA _ PL ANT , Ġplant ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Negative Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cancel ") Ġ{ Ġdialog , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġcancelled Ġthe Ġdialog ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }