/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠEric sson ĠAB Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// 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 Ġeu . sof ie _ iot . s ma ug . mobile . debug Ċ Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . lifecycle Scope Ċ import Ġeu . sof ie _ iot . s ma ug . mobile . MainActivity Ċ import Ġeu . sof ie _ iot . s ma ug . mobile . S ma ug Mobile Application Ċ import Ġeu . sof ie _ iot . s ma ug . mobile . model . Locker Activity Ċ import Ġeu . sof ie _ iot . s ma ug . mobile . model . Rent Ċ import Ġeu . sof ie _ iot . s ma ug . n fc . messages . to Hex Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġkotlin . random . Random Ċ Ċ @ Experimental Unsigned Types Ċ class ĠDebug Actions ( val Ġfragment : ĠFragment ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġapp Ġ= Ġfragment . require Activity (). application Ġas ĠS ma ug Mobile Application ĊĠĠĠ Ġval Ġmain Ġ= Ġfragment . activity Ġas ĠMainActivity ĊĠĠĠ Ġval Ġcontext Ġ= Ġfragment . require Context () ĊĠĠĠ Ġval ĠTAG Ġ= Ġ" Debug Actions " ĊĊĠĠĠ Ġfun Ġtoast NotImplemented () Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Sorry , Ġnot Ġyet Ġimplemented ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtap ( id : ĠLong ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtap Ġin Ġ** main Ġactivity Ġscope **, Ġnot Ġin Ġfragment Ġscope , Ġas Ġt apping Ġcan Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcurrent Ġfragment Ġto Ġbe Ġchanged Ġ--- Ġterminating Ġthe ĠN FC Ġt apping Ġprocess !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlock er Ġ= Ġmodels . locker ById ( id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarket place Ġ= Ġmodels . marketplace ById ( locker . marketplace Id ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġmodels . activities For Locker ( id ). first OrNull ()?. state Ġ?: ĠL ocker Activity . STATE _ UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġfix Ġthe Ġblo ody Ġdata Ġmodel Ġthis Ġkind Ġof Ġc rap Ġis Ġl itter ed Ġall Ġover Ġthe Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthis Ġis Ġactually Ġa Ġtri state , Ġthere 's Ġ" UNKNOWN " Ġas Ġwell ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn fc Ġ= ĠMock N fc ( locker . unique Id !! , Ġmarket place . contract . address , Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo Ġadd Ġis rent ed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain . handle N fc ( n fc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Sim ulating Ġt apping Ġlock er Ġ#$ id ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sim ulating Ġt apping Ġlock er Ġ#$ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġrandom Locker Id () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠList ( 1 0 ) Ġ{ Ġ( (' a ' .. ' f ') Ġ+ Ġ(' 0 ' .. ' 9 ')). random () Ġ}. join ToString ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtap New (): Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĠĠĠĠĠĠĠ Ġmain . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmarket place Ġ= Ġmodels . marketplace ById ( 1 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġ" tap -" Ġ+ Ġrandom Locker Id () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn fc Ġ= ĠMock N fc ( id , Ġmarket place . contract . address , ĠL ocker Activity . STATE _ UNKNOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain . handle N fc ( n fc ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Sim ulating Ġt apping Ġnew Ġlock er Ġ'$ id '", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sim ulating Ġt apping Ġnew Ġlock er Ġ'$ id '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbe acon New (): Ġ() Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġuse Ġ 0 xffff Ġas Ġleader Ġto Ġindicate Ġfor Ġfake Ġbackend Ġinterface Ġthis Ġis Ġintention al ĊĠĠĠĠĠĠĠ Ġval Ġi id Ġ= Ġbyte ArrayOf ( 0 xff . to Byte (), Ġ 0 xff . to Byte ()) Ġ+ ĠRandom . next Bytes ( 4 ) ĊĠĠĠĠĠĠĠ Ġmain . on Beacon Dis covered ( iid , Ġ- 1 0 . 0 , Ġ 1 0 ) Ġ// Ġrandom Ġother Ġvalues ĊĊĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" Sim ulating Ġbe acon Ġfrom Ġlock er Ġ${ iid . to Hex () }", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" Sim ulating Ġbe acon Ġfrom Ġlock er Ġ${ iid . to Hex () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear R ents ( locker Id : ĠLong ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( rent Ġin Ġmodels . rent s For Locker Between ( locker Id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" de leting Ġrent Ġfrom Ġlock er Ġ$ locker Id : Ġ$ rent ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . delete Rent ( rent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrent ( locker Id : ĠLong , Ġduration : ĠDuration , Ġstart : ĠDuration Ġ= ĠDuration . ZERO ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Rent ( locker Id , Ġduration , Ġstart ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecord Rent ( locker Id : ĠLong , Ġduration : ĠDuration , Ġstart : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now () ĊĠĠĠĠĠĠĠ Ġval Ġrent Ġ= ĠR ent ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock er Id Ġ= Ġlock er Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġnow . plus ( start ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġnow . plus ( start ). plus ( duration )) ĊĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . insert Rent ( rent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrecord Action ( locker Id : ĠLong , Ġtype : ĠInt , Ġstate : ĠInt , Ġsuccess : ĠBoolean , Ġmessage : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĠĠĠĠĠĠĠ Ġval Ġactivity Ġ= ĠL ocker Activity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock er Id Ġ= Ġlock er Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsucceeded Ġ= Ġsuccess , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġmessage ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . insert Activity ( activity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrecord ( locker Id : ĠLong , Ġtype : ĠInt , Ġstate : ĠInt , Ġsuccess : ĠBoolean Ġ= Ġtrue , Ġmessage : ĠString ? Ġ= Ġnull ): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrecord Action ( locker Id , Ġtype , Ġstate , Ġsuccess , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrandom Rent (): Ġ() Ġ-> ĠUnit Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġrent ed Ġlock ers Ġand Ġthose Ġthat Ġare Ġnot , Ġby Ġtheir Ġids Ġat Ġthis Ġstage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrent ed Ġ= Ġapp . db . models . rent s Over (). map Ġ{ Ġit . locker Id Ġ}. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Ġ= Ġapp . db . models . all Lock ers (). map Ġ{ Ġit . id Ġ}. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun rent ed Ġ= Ġall . minus ( rent ed ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" rent ed =$ rent ed Ġun rent ed =$ un rent ed ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġrent () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġun rent ed . random () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" random Ġrent : Ġid =$ id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . db . models . insert Rent ( Rent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlock er Id Ġ= Ġid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= ĠInstant . now (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= ĠInstant . now (). plus Seconds ( 3 6 0 0 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġun rent () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġrent ed . random () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" random Ġun rent : Ġid =$ id ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . db . models . rent s For Locker Between ( id ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapp . db . models . delete Rent ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoracle Bit Ġ= ĠRandom . next Boolean () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdecide Ġwhether Ġto Ġrent Ġor Ġun rent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun rent ed . isEmpty () Ġand Ġrent ed . isEmpty () Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" no Ġlock ers , Ġcan Ġnot Ġrandomly Ġrent Ġor Ġun rent !") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġforced Ġhand ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun rent ed . isEmpty () Ġand Ġrent ed . isNotEmpty () Ġ-> Ġun rent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun rent ed . isNotEmpty () Ġand Ġrent ed . isEmpty () Ġ-> Ġrent () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġotherwise Ġrandom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoracle Bit Ġ-> Ġrent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! oracle Bit Ġ-> Ġun rent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Lock ers (): Ġ(() Ġ-> ĠUnit )? Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= Ġapp . db . models ĊĠĠĠĠĠĠĠ Ġfragment . lifecycle Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodels . delete Locker ( lock ers Ġ= Ġmodels . all Lock ers (). to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }