/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 0 ĠOpen ĠFood ĠF acts Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġopen food facts . github . scr ach x . open food . features . product . edit Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . result . contract . Activity Result Contract Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 Ċ import Ġandroidx . view pager 2 . widget . ViewPager 2 . On Page Change Callback Ċ import Ġcom . google . android . material . dialog . Material AlertDialog Builder Ċ import Ġcom . google . android . material . sn ackbar . Base Transient Bottom Bar . LENGTH _ IN DEFIN ITE Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . Dispatch ers . IO Ċ import Ġkotlinx . coroutines . Dispatch ers . Main Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġokhttp 3 . RequestBody Ċ import Ġopen food facts . github . scr ach x . open food . App Fl avors . OB F Ċ import Ġopen food facts . github . scr ach x . open food . App Fl avors . OFF Ċ import Ġopen food facts . github . scr ach x . open food . App Fl avors . OP F Ċ import Ġopen food facts . github . scr ach x . open food . App Fl avors . OP FF Ċ import Ġopen food facts . github . scr ach x . open food . App Fl avors . is Fl avors Ċ import Ġopen food facts . github . scr ach x . open food . R Ċ import Ġopen food facts . github . scr ach x . open food . analytics . Analytics Event Ċ import Ġopen food facts . github . scr ach x . open food . analytics . Mat omo Analytics Ċ import Ġopen food facts . github . scr ach x . open food . databinding . Activity Edit Product Binding Ċ import Ġopen food facts . github . scr ach x . open food . features . product . Product Fragment Pager Adapter Ċ import Ġopen food facts . github . scr ach x . open food . features . product . edit . ingredients . Edit Ing redients Fragment Ċ import Ġopen food facts . github . scr ach x . open food . features . product . edit . nut r ition . Product Edit N utr ition Fact s Fragment Ċ import Ġopen food facts . github . scr ach x . open food . features . product . edit . overview . Edit Overview Fragment Ċ import Ġopen food facts . github . scr ach x . open food . features . shared . Base Activity Ċ import Ġopen food facts . github . scr ach x . open food . images . IMG _ ID Ċ import Ġopen food facts . github . scr ach x . open food . images . Product Image Ċ import Ġopen food facts . github . scr ach x . open food . jobs . Product Uploader Worker . Companion . schedule Product Upload Ċ import Ġopen food facts . github . scr ach x . open food . models . Dao Session Ċ import Ġopen food facts . github . scr ach x . open food . models . Product Ċ import Ġopen food facts . github . scr ach x . open food . models . Product Image Field Ċ import Ġopen food facts . github . scr ach x . open food . models . entities . Offline Saved Product Ċ import Ġopen food facts . github . scr ach x . open food . models . entities . To Upload Product Ċ import Ġopen food facts . github . scr ach x . open food . network . Api Fields Ċ import Ġopen food facts . github . scr ach x . open food . network . services . Products API Ċ import Ġopen food facts . github . scr ach x . open food . repositories . Offline Product Repository Ċ import Ġopen food facts . github . scr ach x . open food . repositories . Product Repository Ċ import Ġopen food facts . github . scr ach x . open food . repositories . Product Repository . Companion . PNG _ EXT Ċ import Ġopen food facts . github . scr ach x . open food . repositories . Product Repository . Companion . addTo History Ċ import Ġopen food facts . github . scr ach x . open food . utils . clear Camera Cache Ċ import Ġopen food facts . github . scr ach x . open food . utils . get Login Preferences Ċ import Ġopen food facts . github . scr ach x . open food . utils . get Product State Ċ import Ġopen food facts . github . scr ach x . open food . utils . hide Keyboard Ċ import Ġjava . io . IOException Ċ import Ġjavax . inject . Inject Ċ Ċ // ĠTODO : Ġ 1 2 / 1 0 / 2 0 2 1 Ġrefactor Ġto Ġuse Ġan Ġactivity Ġview Ġmodel Ġshared Ġbetween Ġfragments Ġof ĠProduct Edit Activity Ċ @ Android EntryPoint Ċ class ĠProduct Edit Activity Ġ: ĠBase Activity () Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġ_ binding : ĠActivity Edit Product Binding ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġbinding Ġget () Ġ= Ġ_ binding !! ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġclient : ĠProduct Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġoffline Repository : ĠOff line Product Repository ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġdao Session : ĠDao Session ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġproducts Api : ĠProducts API ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġmat omo Analytics : ĠM atom o Analytics ĊĊĠĠĠ Ġ@ Inject ĊĠĠĠ Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĊĠĠĠ Ġprivate Ġval Ġfragments Bundle Ġ= ĠBundle () ĊĊĠĠĠ Ġprivate Ġval Ġadd Product Photos Fragment Ġ= ĠProduct Edit Photos Fragment () ĊĠĠĠ Ġprivate Ġval Ġn utr ition Fact s Fragment Ġ= ĠProduct Edit N utr ition Fact s Fragment () ĊĠĠĠ Ġprivate Ġval Ġingredients Fragment Ġ= ĠEdit Ing redients Fragment () ĊĠĠĠ Ġprivate Ġval Ġedit Overview Fragment Ġ= ĠEdit Overview Fragment () ĊĊĠĠĠ Ġprivate Ġval Ġimages FilePath Ġ= ĠarrayOf Null s < String >( 3 ) ĊĊĠĠĠ Ġprivate Ġvar Ġediting Mode Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġimage Front Uploaded Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġimage Ing redients Uploaded Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġimage N utr ition Fact s Uploaded Ġ= Ġfalse ĊĊĠĠĠ Ġvar Ġinitial Values : ĠMutable Map < String , ĠString ?> ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġvar Ġm Product : ĠProduct ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġproduct Details Ġ= Ġmutable Map Of < String , ĠString ?> () ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . product _ edit _ menu , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġis Ġused Ġto Ġupdate Ġthe Ġtimeline . ĊĠĠĠĠ Ġ* Ġ 0 Ġmeans Ġinactive Ġstage , Ġ 1 Ġmeans Ġactive Ġstage Ġand Ġ 2 Ġmeans Ġcompleted Ġstage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoverview Stage Ġchange Ġthe Ġstate Ġof Ġoverview Ġindicator ĊĠĠĠĠ Ġ* Ġ@ param Ġingredients Stage Ġchange Ġthe Ġstate Ġof Ġingredients Ġindicator ĊĠĠĠĠ Ġ* Ġ@ param Ġn utr ition Fact s Stage Ġchange Ġthe Ġstate Ġof Ġn utr ition Ġfacts Ġindicator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Timeline Indicator ( overview Stage : ĠInt , Ġingredients Stage : ĠInt , Ġn utr ition Fact s Stage : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . overview Indicator . update Time Line ( overview Stage ) ĊĠĠĠĠĠĠĠ Ġbinding . ingredients Indicator . update Time Line ( ingredients Stage ) ĊĠĠĠĠĠĠĠ Ġbinding . nut r ition Fact s Indicator . update Time Line ( nut r ition Fact s Stage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġuser Ġchanged Ġsomething , Ġalert Ġbefore Ġexiting ĊĠĠĠĠĠĠĠ Ġif Ġ( get Updated Fields Map (). isNotEmpty ()) Ġshow Exit Confirm Dialog () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . id . home Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Updated Fields Map (). isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Exit Confirm Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . save _ product Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Fields Then Save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Exit Confirm Dialog () Ġ{ ĊĠĠĠĠĠĠĠ ĠMaterial AlertDialog Builder ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( R . string . save _ product ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( R . string . txt Save ) Ġ{ Ġ_, Ġ_ Ġ-> Ġcheck Fields Then Save () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Negative Button ( R . string . txt _ discard ) Ġ{ Ġ_, Ġ_ Ġ-> Ġsuper . on Back Pressed () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Page ( position : ĠInt ) Ġ= Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġupdate Timeline Indicator ( 2 , Ġ 1 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġupdate Timeline Indicator ( 2 , Ġ 2 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠ 0 Ġ-> Ġupdate Timeline Indicator ( 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Timeline Indicator ( 1 , Ġ 0 , Ġ 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġview Ġbinding ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= ĠActivity Edit Product Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĊĠĠĠĠĠĠĠ ĠsetTitle ( R . string . offline _ product _ addition _ title ) ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġonclick Ġlisteners ĊĠĠĠĠĠĠĠ Ġbinding . overview Indicator . setOnClickListener Ġ{ Ġswitch To Overview Page () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . ingredients Indicator . setOnClickListener Ġ{ Ġswitch To Ing redients Page () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . nut r ition Fact s Indicator . setOnClickListener Ġ{ Ġswitch To N utr ition Fact s Page () Ġ} ĊĠĠĠĠĠĠĠ Ġbinding . view pager . register On Page Change Callback ( object Ġ: ĠOn Page Change Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Page Selected ( position : ĠInt ) Ġ= Ġselect Page ( position ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġproduct State Ġ= Ġget Product State () ĊĠĠĠĠĠĠĠ Ġvar Ġoffline Saved Product Ġ= Ġintent . get Serializable Extra ( KEY _ EDIT _ OFF LINE _ PRODUCT ) Ġas ĠOff line Saved Product ? ĊĊĠĠĠĠĠĠĠ Ġval Ġm Edit Product Ġ= Ġintent . get Serializable Extra ( KEY _ EDIT _ PRODUCT ) Ġas ĠProduct ? ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . getBoolean Extra ( KEY _ PER FORM _ OCR , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Bundle . put Boolean ( KEY _ PER FORM _ OCR , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( intent . getBoolean Extra ( KEY _ SEND _ UPDATED , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Bundle . put Boolean ( KEY _ SEND _ UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( product State Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Product Ġ= Ġproduct State . product ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSearch Ġif Ġthe Ġbarcode Ġalready Ġexists Ġin Ġthe ĠOff line Saved Products Ġdb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffline Saved Product Ġ= Ġoffline Repository . get Offline Product By Barcode ( product State . product !!. code ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Edit Product Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( R . string . edit _ product _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Product Ġ= Ġm Edit Product ĊĠĠĠĠĠĠĠĠĠĠĠ Ġediting Mode Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Bundle . put Boolean ( KEY _ IS _ EDIT ING , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Values Ġ= Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( offline Saved Product Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragments Bundle . put Serializable ( KEY _ EDIT _ OFF LINE _ PRODUCT , Ġoffline Saved Product ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġalready Ġexisting Ġimages Ġin Ġproduct Details Ġfor ĠUI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 0 ] Ġ= Ġoffline Saved Product . image Front ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 1 ] Ġ= Ġoffline Saved Product . product Details [ Api Fields . Keys . IMAGE _ ING RE DI ENTS ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 2 ] Ġ= Ġoffline Saved Product . product Details [ Api Fields . Keys . IMAGE _ N UT R ITION ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġstatus Ġof Ġimages Ġfrom Ġproduct Details Map , Ġwhether Ġuploaded Ġor Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Front Uploaded Ġ= Ġoffline Saved Product . product Details [ Api Fields . Keys . IMAGE _ FRONT _ UP LOADED ]. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ing redients Uploaded Ġ= Ġoffline Saved Product . product Details [ Api Fields . Keys . IMAGE _ ING RE DI ENTS _ UP LOADED ]. to Boolean () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage N utr ition Fact s Uploaded Ġ= Ġoffline Saved Product . product Details [ Api Fields . Keys . IMAGE _ N UT R ITION _ UP LOADED ]. to Boolean () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( product State Ġ== Ġnull Ġ&& Ġoffline Saved Product Ġ== Ġnull Ġ&& Ġm Edit Product Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . error _ adding _ product , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsetup ViewPager ( binding . view pager ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġclear Camera Cache () ĊĠĠĠĠĠĠĠ Ġ_ binding Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup ViewPager ( view Pager : ĠView Pager 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInitialize Ġfragments ĊĠĠĠĠĠĠĠ Ġfragments Bundle . put Serializable ( KEY _ PRODUCT , Ġm Product ) ĊĊĠĠĠĠĠĠĠ Ġedit Overview Fragment . arguments Ġ= Ġfragments Bundle ĊĠĠĠĠĠĠĠ Ġingredients Fragment . arguments Ġ= Ġfragments Bundle ĊĊĠĠĠĠĠĠĠ Ġval Ġadapter Result Ġ= ĠProduct Fragment Pager Adapter ( this ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+= Ġedit Overview Fragment Ġto ĠgetString ( R . string . overview ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġ+= Ġingredients Fragment Ġto ĠgetString ( R . string . ingredients ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġon Ġoff Ġor Ġop ff , Ġadd ĠN utr ition ĠF acts Ġfragment ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fl avors ( OFF , ĠOP FF ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn utr ition Fact s Fragment . arguments Ġ= Ġfragments Bundle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Result Ġ+= Ġn utr ition Fact s Fragment Ġto ĠgetString ( R . string . nut r ition _ facts ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fl avors ( OB F , ĠOP F ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . text N utr ition Fact s Indicator . setText ( R . string . photos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Product Photos Fragment . arguments Ġ= Ġfragments Bundle ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Result Ġ+= Ġadd Product Photos Fragment Ġto ĠgetString ( R . string . photos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview Pager . off screen Page Limit Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġview Pager . adapter Ġ= Ġadapter Result ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Login Password Info (): ĠMap < String , ĠRequest Body > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= Ġhash Map Of < String , ĠRequest Body >() ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġget Login Preferences () ĊĊĠĠĠĠĠĠĠ Ġval Ġlogin Ġ= Ġsettings . getString (" user ", Ġ"") Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġsettings . getString (" pass ", Ġ"") Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġif Ġ( login . isNotEmpty () Ġ&& Ġpassword . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ Api Fields . Keys . USER _ ID ] Ġ= Ġcreate Text Plain ( login ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ Api Fields . Keys . USER _ PASS ] Ġ= Ġcreate Text Plain ( password ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmap [ Api Fields . Keys . USER _ COMMENT ] Ġ= Ġcreate Text Plain ( client . get Comment To Upload ( login )) ĊĠĠĠĠĠĠĠ Ġreturn Ġmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave Product () Ġ{ ĊĠĠĠĠĠĠĠ Ġproduct Details Ġ+= Ġget Updated Fields Map () Ġ+ Ġget Login Info Map () ĊĠĠĠĠĠĠĠ Ġsave Product Offline () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Updated Fields Map (): ĠMap < String , ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated Values Ġ= Ġedit Overview Fragment . get Updated Fields Map (). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġupdated Values Ġ+= Ġingredients Fragment . get Updated Fields Map () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Fl avors ( OFF , ĠOP FF )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdated Values Ġ+= Ġn utr ition Fact s Fragment . get Updated Fields Map () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġupdated Values ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproceed () Ġ= Ġif Ġ( binding . view pager . currentItem Ġ< Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . view pager . setCurrent Item ( binding . view pager . currentItem Ġ+ Ġ 1 , Ġtrue ) ĊĠĠĠ Ġ} Ġelse Ġcheck Fields Then Save () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave Ġthe Ġcurrent Ġproduct Ġin Ġthe Ġoffline Ġdb ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave Product Offline () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġimages Ġto Ġthe Ġproduct Details Ġto Ġdisplay Ġthem Ġin ĠUI Ġlater . ĊĠĠĠĠĠĠĠ Ġimages FilePath [ 0 ]?. let Ġ{ Ġproduct Details [ Api Fields . Keys . IMAGE _ FRONT ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġimages FilePath [ 1 ]?. let Ġ{ Ġproduct Details [ Api Fields . Keys . IMAGE _ ING RE DI ENTS ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġimages FilePath [ 2 ]?. let Ġ{ Ġproduct Details [ Api Fields . Keys . IMAGE _ N UT R ITION ] Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġthe Ġstatus Ġof Ġimages Ġto Ġthe Ġproduct Details , Ġwhether Ġuploaded Ġor Ġnot ĊĠĠĠĠĠĠĠ Ġif Ġ( image Front Uploaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details [ Api Fields . Keys . IMAGE _ FRONT _ UP LOADED ] Ġ= Ġtrue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image Ing redients Uploaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details [ Api Fields . Keys . IMAGE _ ING RE DI ENTS _ UP LOADED ] Ġ= Ġtrue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image N utr ition Fact s Uploaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Details [ Api Fields . Keys . IMAGE _ N UT R ITION _ UP LOADED ] Ġ= Ġtrue . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbarcode Ġ= Ġproduct Details [ Api Fields . Keys . BAR CODE ] !! ĊĊĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġproduct Ġto Ġlocal Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġto Save Offline Ġ= ĠOff line Saved Product ( barcode , Ġproduct Details ) ĊĠĠĠĠĠĠĠ Ġwith Context ( IO ) Ġ{ Ġdao Session . offline Saved Product Dao . insert Or Replace ( to Save Offline ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġto Ġhistory Ġdb ĊĠĠĠĠĠĠĠ Ġdao Session . history Product Dao . addTo History ( to Save Offline ) ĊĊĠĠĠĠĠĠĠ Ġschedule Product Upload ( this , Ġshared Preferences ) ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . product Saved Toast , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ Ġhide Keyboard () ĊĊĠĠĠĠĠĠĠ Ġ// ĠReport Ġanalytics ĊĠĠĠĠĠĠĠ Ġif Ġ( editing Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmat omo Analytics . track Event ( Analytics Event . Product Edited ( product Details [ Api Fields . Keys . BAR CODE ])) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmat omo Analytics . track Event ( Analytics Event . Product Created ( product Details [ Api Fields . Keys . BAR CODE ])) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Result ( RESULT _ OK ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Fields Then Save () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( editing Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġedit Ġmode , Ġtherefore Ġdo Ġnot Ġcheck Ġwhether Ġfront Ġimage Ġis Ġempty Ġor Ġnot Ġhowever Ġdo Ġcheck Ġthe Ġn utr ition Ġfacts Ġvalues . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Fl avors ( OFF , ĠOP FF ) Ġ&& Ġn utr ition Fact s Fragment . any Invalid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere Ġare Ġany Ġinvalid Ġfield Ġand Ġthere Ġis Ġn utr ition Ġdata , Ġscroll Ġto Ġthe Ġn utr ition Ġfragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . view pager . setCurrent Item ( 2 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġadd Ġmode , Ġcheck Ġif Ġwe Ġhave Ġrequired Ġfields ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( edit Overview Fragment . any Invalid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . view pager . setCurrent Item ( 0 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Fl avors ( OFF , ĠOP FF ) Ġ&& Ġn utr ition Fact s Fragment . any Invalid ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . view pager . setCurrent Item ( 2 , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġall Ġis Ġcorrect , Ġsave Ġthe Ġproduct ĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġsave Product () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Login Info Map (): ĠMap < String , ĠString ?> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsettings Ġ= Ġget Login Preferences () ĊĊĠĠĠĠĠĠĠ Ġval Ġlogin Ġ= Ġsettings . getString (" user ", Ġ"") !! ĊĠĠĠĠĠĠĠ Ġval Ġpassword Ġ= Ġsettings . getString (" pass ", Ġ"") !! ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( login . isEmpty () Ġ|| Ġpassword . isEmpty ()) Ġempty Map () ĊĠĠĠĠĠĠĠ Ġelse Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Fields . Keys . USER _ ID Ġto Ġlogin , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Fields . Keys . USER _ PASS Ġto Ġpassword ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswitch To Overview Page () Ġ= Ġbinding . view pager . setCurrent Item ( 0 , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġfun Ġswitch To Ing redients Page () Ġ= Ġbinding . view pager . setCurrent Item ( 1 , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġfun Ġswitch To N utr ition Fact s Page () Ġ= Ġbinding . view pager . setCurrent Item ( 2 , Ġtrue ) ĊĊĠĠĠ Ġfun Ġsave Photo ( image : ĠProduct Image , Ġfragment Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlang Ġ= Ġget Product Language For Edition () ĊĠĠĠĠĠĠĠ Ġvar Ġocr Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġimg Map Ġ= Ġhash Map Of < String , ĠRequest Body ? >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApi Fields . Keys . BAR CODE Ġto Ġimage . barcode Body , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" image field " Ġto Ġcreate Text Plain ("${ image . image Field }_ $ lang ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( image . img Front Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 0 ] Ġ= Ġimage . filePath ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Map [ """ img upload _ front "; Ġfilename =" front _$ lang $ PNG _ EXT "" "] Ġ= Ġimage . img Front ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image . img Ing redients Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Map [ """ img upload _ ingredients "; Ġfilename =" ingredients _$ lang $ PNG _ EXT "" "] Ġ= Ġimage . img Ing redients ĊĠĠĠĠĠĠĠĠĠĠĠ Ġocr Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 1 ] Ġ= Ġimage . filePath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image . img N utr ition Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Map [ """ img upload _ nut r ition "; Ġfilename =" nut r ition _$ lang $ PNG _ EXT "" "] Ġ= Ġimage . img N utr ition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 2 ] Ġ= Ġimage . filePath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image . img Pack aging Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Map [ """ img upload _ packaging "; Ġfilename =" packaging _$ lang $ PNG _ EXT "" "] Ġ= Ġimage . img Pack aging ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimages FilePath [ 3 ] Ġ= Ġimage . filePath ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( image . img Other Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimg Map [ """ img upload _ other "; Ġfilename =" other _$ lang $ PNG _ EXT "" "] Ġ= Ġimage . img Other ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAttribute Ġthe Ġupload Ġto Ġthe Ġconnected Ġuser ĊĠĠĠĠĠĠĠ Ġimg Map Ġ+= Ġget Login Password Info () ĊĊĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġsave Photo ( img Map , Ġimage , Ġfragment Index , Ġocr ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġsave Photo ( ĊĠĠĠĠĠĠĠ Ġimg Map : ĠMap < String , ĠRequest Body ? >, ĊĠĠĠĠĠĠĠ Ġimage : ĠProduct Image , ĊĠĠĠĠĠĠĠ Ġfragment Index : ĠInt , ĊĠĠĠĠĠĠĠ Ġperform OCR : ĠBoolean ĊĠĠĠ Ġ) Ġ= Ġwith Context ( IO ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġshow Image Progress ( fragment Index ) ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Node Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproducts Api . save Image ( img Map ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠA Ġnetwork Ġerror Ġhappened ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġis ĠIOException ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Image Progress ( fragment Index , ĠgetString ( R . string . no _ internet _ connection )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOGGER _ TAG , Ġerr . message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( image . image Field Ġ=== ĠProduct Image Field . OTHER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao Session . to Upload Product Dao . insert Or Replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTo Upload Product ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . barcode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . filePath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage . image Field . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( this :: class . simple Name , Ġerr . message Ġ?: Ġ" Empty Ġerror .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Image Progress ( fragment Index , Ġerr . message Ġ?: Ġ" Empty Ġerror .", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Product Edit Activity , Ġerr . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġjson Node [" status "]. as Text () ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ" status Ġnot Ġok ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġjson Node [" error "]. as Text () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalready Sent Ġ= Ġerror Ġ== Ġ" This Ġpicture Ġhas Ġalready Ġbeen Ġsent ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( already Sent Ġ&& Ġperform OCR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Image Progress ( fragment Index , ĠgetString ( R . string . image _ uploaded _ successfully )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ Ġperform OCR ( image . barcode , Ġ" ingredients _${ get Product Language For Edition () }") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhide Image Progress ( fragment Index , Ġerror , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( image . image Field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct Image Field . FRONT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Front Uploaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct Image Field . ING RE DI ENTS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Ing redients Uploaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProduct Image Field . N UT R ITION Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage N utr ition Fact s Uploaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġhide Image Progress ( fragment Index , ĠgetString ( R . string . image _ uploaded _ successfully )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage Field Ġ= Ġjson Node [" image field "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimg Id Ġ= Ġjson Node [" image "][" img id "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment Index Ġ!= Ġ 3 Ġ&& Ġfragment Index Ġ!= Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNot ĠOTHER Ġimage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Photo ( image , Ġimage Field , Ġimg Id , Ġperform OCR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġset Photo ( image : ĠProduct Image , Ġimage Field : ĠString , Ġimg Id : ĠString , Ġperform OCR : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Map Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠI MG _ ID Ġto Ġimg Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" id " Ġto Ġimage Field ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġjson Node Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproducts Api . edit Image ( image . barcode , Ġquery Map ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġis ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform OCR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠfindViewById < View >( R . id . coordinator _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . no _ internet _ unable _ to _ extract _ ingredients , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). setAction ( R . string . txt _ try _ again ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġset Photo ( image , Ġimage Field , Ġimg Id , Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( this :: class . simple Name , Ġerr . message !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Product Edit Activity , Ġerr . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġjson Node [" status "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform OCR Ġ&& Ġstatus Ġ== Ġ" status Ġok ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperform OCR ( image . barcode , Ġimage Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġsuspend Ġfun Ġperform OCR ( code : ĠString , Ġimage Field : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġingredients Fragment . show OCR Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġwith Context ( IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproducts Api . perform OCR ( code , Ġimage Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( err : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ Ġingredients Fragment . hide OCR Progress () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġis ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠfindViewById < View >( R . id . coordinator _ layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( view , ĠR . string . no _ internet _ unable _ to _ extract _ ingredients , ĠLEN GTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . txt _ try _ again ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlifecycle Scope . launch Ġ{ Ġperform OCR ( code , Ġimage Field ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( this :: class . simple Name , Ġerr . message , Ġerr ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this @ Product Edit Activity , Ġerr . message , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġingredients Fragment . hide OCR Progress () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġnode [" status "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== Ġ" 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġocr Result Ġ= Ġnode [" ingredients _ text _ from _ image "]. as Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġingredients Fragment . set Ing redients ( status , Ġocr Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġingredients Fragment . set Ing redients ( status , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġhide Image Progress ( ĊĠĠĠĠĠĠĠ Ġposition : ĠInt , ĊĠĠĠĠĠĠĠ Ġmsg : ĠString , ĊĠĠĠĠĠĠĠ Ġerror : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ) Ġ= Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġedit Overview Fragment . hide Image Progress ( error , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġingredients Fragment . hide Image Progress ( error , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġn utr ition Fact s Fragment . hide Image Progress ( error , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġedit Overview Fragment . hide Other Image Progress ( error , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġadd Product Photos Fragment . hide Image Progress ( error , Ġmsg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġshow Image Progress ( position : ĠInt ) Ġ= Ġwith Context ( Main ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( position ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġedit Overview Fragment . show Image Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġingredients Fragment . show Image Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġn utr ition Fact s Fragment . show Image Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġedit Overview Fragment . show Other Image Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠ 4 Ġ-> Ġadd Product Photos Fragment . show Image Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Product Language For Edition () Ġ= Ġproduct Details [ Api Fields . Keys . LANG ] ĊĊĠĠĠ Ġfun Ġset Product Language Code ( language Code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġproduct Details [ Api Fields . Keys . LANG ] Ġ= Ġlanguage Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Language () Ġ{ ĊĠĠĠĠĠĠĠ Ġingredients Fragment . load Ing redients Image () ĊĠĠĠĠĠĠĠ Ġn utr ition Fact s Fragment . load N utr ition Image () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Ing redients ( status : ĠString ?, Ġingredients : ĠString ?) Ġ= ĊĠĠĠĠĠĠĠ Ġingredients Fragment . set Ing redients ( status , Ġingredients ) ĊĊĠĠĠ Ġclass ĠPerform OCR Contract Ġ: ĠActivity Result Contract < Product ?, ĠBoolean >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġproduct : ĠProduct ?) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠProduct Edit Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ EDIT _ PRODUCT , Ġproduct ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ PER FORM _ OCR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?) Ġ= ĠresultCode Ġ== ĠRESULT _ OK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSend Updated Img Contract Ġ: ĠActivity Result Contract < Product , ĠBoolean >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġproduct : ĠProduct ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠProduct Edit Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ EDIT _ PRODUCT , Ġproduct ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ SEND _ UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?) Ġ= ĠresultCode Ġ== ĠRESULT _ OK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġclass ĠEdit Product Contract Ġ: ĠActivity Result Contract < Product , ĠBoolean >() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Intent ( context : ĠContext , Ġinput : ĠProduct ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠProduct Edit Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ EDIT _ PRODUCT , Ġinput ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Result ( result Code : ĠInt , Ġintent : ĠIntent ?) Ġ= ĠresultCode Ġ== ĠRESULT _ OK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOGGER _ TAG Ġ= ĠProduct Edit Activity :: class . simple Name ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PER FORM _ OCR Ġ= Ġ" perform _ ocr " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ SEND _ UPDATED Ġ= Ġ" send _ updated " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ MO DIFY _ N UT R ITION _ PROMPT Ġ= Ġ" modify _ nut r ition _ prompt " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ MO DIFY _ CATEGORY _ PROMPT Ġ= Ġ" modify _ category _ prompt " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ EDIT _ OFF LINE _ PRODUCT Ġ= Ġ" edit _ offline _ product " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ EDIT _ PRODUCT Ġ= Ġ" edit _ product " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ PRODUCT Ġ= Ġ" product " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ IS _ EDIT ING Ġ= Ġ" is _ edition " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ STATE Ġ= Ġ" state " ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠView . update Time Line ( stage : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( stage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġset Background Resource ( R . drawable . stage _ inactive ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġset Background Resource ( R . drawable . stage _ active ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġset Background Resource ( R . drawable . stage _ complete ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproduct : ĠProduct , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Updated : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform O cr : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Category Prompt : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow N utr ition Prompt : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠProduct Edit Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ EDIT _ PRODUCT , Ġproduct ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send Updated ) Ġput Extra ( KEY _ SEND _ UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform O cr ) Ġput Extra ( KEY _ PER FORM _ OCR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Category Prompt ) Ġput Extra ( KEY _ MO DIFY _ CATEGORY _ PROMPT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show N utr ition Prompt ) Ġput Extra ( KEY _ MO DIFY _ N UT R ITION _ PROMPT , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffline Product : ĠOff line Saved Product , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Updated : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform O cr : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Category Prompt : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow N utr ition Prompt : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIntent ( context , ĠProduct Edit Activity :: class . java ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra ( KEY _ EDIT _ OFF LINE _ PRODUCT , Ġoffline Product ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( send Updated ) Ġput Extra ( KEY _ SEND _ UPDATED , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( perform O cr ) Ġput Extra ( KEY _ PER FORM _ OCR , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Category Prompt ) Ġput Extra ( KEY _ MO DIFY _ CATEGORY _ PROMPT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show N utr ition Prompt ) Ġput Extra ( KEY _ MO DIFY _ N UT R ITION _ PROMPT , Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . startActivity ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Text Plain ( code : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRequest Body . create ( Product Repository . MIME _ TEXT , Ġcode ) ĊĠĠĠ Ġ} Ċ } Ċ