package Ġkr . ac . sn u . hc il . om n itr ack . ui . pages . items Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Bundle Ċ import Ġcom . google . gson . JsonObject Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . subjects . Behavior Subject Ċ import Ġkr . ac . sn u . hc il . android . common . containers . Any Value With Timestamp Ċ import Ġkr . ac . sn u . hc il . android . common . onNext If Differ And NotNull Ċ import Ġkr . ac . sn u . hc il . om n itr ack . OT Android App Ċ import Ġkr . ac . sn u . hc il . om n itr ack . OT App Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . Item Logging Source Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . OT Item Builder Wrapper Base Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . database . models . helper models . OT Item Builder DAO Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . database . models . helper models . OT Item Builder FieldValue Entry Ċ import Ġkr . ac . sn u . hc il . om n itr ack . core . serialization . TypeString Serialization Helper Ċ import Ġkr . ac . sn u . hc il . om n itr ack . utils . execute Transaction IfNot In Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠYo ung - Ho Ġon Ġ 1 0 / 9 / 2 0 1 7 . Ċ Ġ*/ Ċ class ĠNew Item Creation ViewModel ( app : ĠApplication ) Ġ: ĠItem Edition ViewModel Base ( app ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ RESERVED _ NEW _ ITEM _ ID Ġ= Ġ" reserved New ItemId " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ RE DIRECT ED _ PAGE _ VISIT _ STATUS Ġ= Ġ" redirect ed Page Visit Status " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ BUILDER _ ID Ġ= Ġ" builder Id " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠRedirect ed Page Status Ġ{ ĊĠĠĠĠĠĠĠ ĠRed irection Not Set , ĠCompleted , ĠNot Vis ited , ĠC anceled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġitem Builder Dao : ĠO T Item Builder DAO ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbuilder Wrapper : ĠO T Item Builder Wrapper Base ĊĊĠĠĠ Ġval Ġredirected Page Visit Status Observable Ġ= ĠBehavior Subject . create Default < Redirect ed Page Status >( Redirect ed Page Status . Red irection Not Set ) ĊĊĠĠĠ Ġval Ġis Red irection Set : ĠBoolean Ġget () Ġ= Ġ! tracker Dao . redirect Url . isNull Or Blank () ĊĊĠĠĠ Ġprivate Ġvar Ġreserved New ItemId : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġfun Ġgenerate New ItemId (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . reserved New ItemId Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . reserved New ItemId !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Inject ( app : ĠO T Android App ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Application < OT App >(). application Component . inject ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Save InstanceState ( out State ) ĊĠĠĠĠĠĠĠ Ġout State . put Long ( KEY _ BUILDER _ ID , Ġthis . item Builder Dao . id ) ĊĠĠĠĠĠĠĠ Ġout State . put Int ( KEY _ RE DIRECT ED _ PAGE _ VISIT _ STATUS , Ġthis . redirect ed Page Visit Status Observable . value ?. ordinal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠRedirect ed Page Status . Red irection Not Set . ordinal ) ĊĠĠĠĠĠĠĠ Ġout State . putString ( KEY _ RESERVED _ NEW _ ITEM _ ID , Ġreserved New ItemId ) ĊĠĠĠĠĠĠĠ Ġrefresh Dao Values () ĊĠĠĠĠĠĠĠ Ġvar Ġhighest Builder Entry Id Ġ= Ġrealm . where ( OT Item Builder FieldValue Entry :: class . java ). max (" id ") ?. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ 0 L ĊĠĠĠĠĠĠĠ Ġitem Builder Dao . data . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . is Managed Ġ&& Ġit . id Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . id Ġ= Ġ++ highest Builder Entry Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrealm . execute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . insert OrUpdate ( item Builder Dao ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( tracker Id : ĠString , Ġmetadata : ĠJsonObject ?, ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( init ( tracker Id )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! tracker Dao . redirect Url . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirected Page Visit Status Observable . onNext If Differ And NotNull ( Redirect ed Page Status . Not Vis ited ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġredirected Page Visit Status Observable . onNext If Differ And NotNull ( Redirect ed Page Status . Red irection Not Set ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġbuilder Dao Result Ġ= Ġif Ġ( load Pending Item Builder ) Ġdb Manager . get (). getItem Builder Query ( tracker Dao ._ id !! , ĠO T Item Builder DAO . HOLDER _ TYPE _ INPUT _ FORM , Ġrealm ). findFirst () Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstored Builder Dao Ġ= Ġif Ġ( savedInstanceState Ġ!= Ġnull Ġ&& ĠsavedInstanceState . containsKey ( KEY _ BUILDER _ ID )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// there Ġis Ġa Ġpending Ġitem Builder . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" restore Ġthe Ġitem Builder ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . where ( OT Item Builder DAO :: class . java ). equalTo (" id ", ĠsavedInstanceState . getLong ( KEY _ BUILDER _ ID )). findFirst () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stored Builder Dao Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewBuilder Id Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . execute Transaction IfNot In Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewBuilder Dao Ġ= Ġrealm . createObject ( OT Item Builder DAO :: class . java , ĠnewBuilder Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewBuilder Dao . tracker Ġ= Ġtracker Dao ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewBuilder Dao . holder Type Ġ= ĠO T Item Builder DAO . HOLDER _ TYPE _ INPUT _ FORM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewBuilder Dao . serialized Metadata Ġ= Ġmetadata ?. toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Builder Dao Ġ= Ġrealm . copyFrom Realm ( newBuilder Dao ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . item Builder Dao Ġ= Ġrealm . copyFrom Realm ( stored Builder Dao ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" metadata : Ġ${ this . item Builder Dao . serialized Metadata }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . builder Wrapper Ġ= ĠO T Item Builder Wrapper Base ( this . item Builder Dao , Ġget Application ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġthis . builder Wrapper . keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġthis . builder Wrapper . getValue Information Of ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue Of Attribute ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Busy Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubscriptions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . builder Wrapper . make Auto Complete Observable ( realm Provider , Ġthis ). subscribe ({ Ġ( field Local Id , Ġvalue With Timestamp ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetValue Of Attribute ( field Local Id , Ġvalue With Timestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Busy Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . reserved New ItemId Ġ= ĠsavedInstanceState . getString ( KEY _ RESERVED _ NEW _ ITEM _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . redirect ed Page Visit Status Observable . onNext If Differ And NotNull ( Redirect ed Page Status . values ()[ savedInstanceState . getInt ( KEY _ RE DIRECT ED _ PAGE _ VISIT _ STATUS )]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetValue Of Attribute ( field Local Id : ĠString , Ġvalue With Timestamp : ĠAny Value With Timestamp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Builder Dao . setValue ( field Local Id , Ġvalue With Timestamp ) ĊĠĠĠĠĠĠĠ Ġsuper . setValue Of Attribute ( field Local Id , Ġvalue With Timestamp ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis ViewModels Dirty (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( viewModel Ġin Ġcurrent Attribute ViewModel List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġitem Builder Dao . data . find Ġ{ Ġit . field Local Id Ġ== ĠviewModel . field Local Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Value Ġ= ĠviewModel . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( vm Value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( vm Value . timestamp Ġ!= Ġmatch . timestamp ) Ġ|| Ġ( vm Value . value Ġ!= Ġmatch . serialized Value ?. let Ġ{ ĠType String Serialization Helper . deserialize ( it ) Ġ})) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn ĠviewModel . value Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Dao Values () Ġ{ ĊĠĠĠĠĠĠĠ Ġrealm . execute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Attribute ViewModel List . forEach Ġ{ Ġattr ViewModel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġattr ViewModel . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Builder Dao . setValue ( attr ViewModel . field Local Id , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmodify Metadata ( handler : Ġ( metadata : ĠJsonObject ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder Wrapper . modify Metadata ( realm , Ġhandler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Editing To Database (): ĠMaybe < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Busy Observable . filter Ġ{ Ġ! it Ġ}. first Or Error (). flatMap Maybe Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Dao Values () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġbuilder Wrapper . save To Item ( null , ĠItem Logging Source . Manual ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ._ id Ġ= Ġreserved New ItemId ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ flatMap Maybe ĠMaybe . from Single < String >( db Manager . get (). save Item Observable ( item , Ġfalse , Ġnull , Ġrealm ). map Ġ{ Ġit . second Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do After Success Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreserved New ItemId Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsync Item ToServer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO T App . logger . write System Log (" Logged Ġnew Ġitem Ġin Ġthe Ġpage . Ġmetadata : Ġ\ n ${ item . serialized Metadata }", Ġ" New Item Creation ViewModel ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġreturn ĠMaybe . just ( null ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġclear History () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubscriptions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Busy Observable . filter Ġ{ Ġ! it Ġ}. subscribe Ġ{ Ġis Busy Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrealm . execute Transaction Ġ{ Ġtransaction Realm Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġda os Ġ= Ġtransaction Realm . where ( OT Item Builder DAO :: class . java ). equalTo (" id ", Ġitem Builder Dao . id ). findAll () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġda os . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . data . delete All From Realm () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġda os . delete All From Realm () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" removed Ġitem Ġbuilder .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠisValid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġset Result Of Redirect ed Page ( result : ĠRedirect ed Page Status ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . redirect ed Page Visit Status Observable . onNext If Differ And NotNull ( result ) ĊĠĠĠ Ġ} Ċ Ċ }