package Ġme . bg reg os . foreground . task Ċ Ċ import Ġandroid . util . Log Ċ import Ġorg . json . JSONArray Ċ import Ġorg . json . JSONObject Ċ import Ġjava . io . Serializable Ċ import Ġjava . lang . Exception Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġkotlin . Comparator Ċ import Ġkotlin . collections . ArrayList Ċ import Ġkotlin . collections . HashMap Ċ Ċ data Ġclass ĠTask ( var Ġname : String ) Ġ: ĠSerializable Ġ{ ĊĠĠĠ Ġvar Ġuuid : UUID Ġ= ĠUUID . randomUUID () ĊĠĠĠ Ġvar Ġdue Date : Date ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcreated Date : Date Ġ= ĠDate () ĊĠĠĠ Ġvar Ġproject : String ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġtags : ArrayList < String > Ġ= ĠArrayList () ĊĠĠĠ Ġvar Ġmodified Date : Date ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġpriority : ĠString ? Ġ= Ġ"" ĊĠĠĠ Ġvar Ġstatus : ĠString Ġ= Ġ" pending " ĊĠĠĠ Ġvar Ġwait Date : Date ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġothers Ġ= Ġmutable Map Of < String , ĠString >() Ġ// un account ed - for Ġfields . Ġ( User ĠDefined ĠAttributes ) ĊĠĠĠ Ġ// List Ġof Ġall Ġpossible ĠTask ĠStat uses Ġat Ġhttps :// task war ri or . org / docs / design / task . html # attr _ status ĊĊĠĠĠ Ġclass ĠDate Compare Ġ: ĠComparator < Task >{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompare ( o 1 : ĠTask , Ġo 2 : ĠTask ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( o 1 . due Date Ġ== Ġnull Ġ&& Ġo 2 . due Date Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( o 1 . due Date Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( o 2 . due Date Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġcompare Values ( o 1 . due Date , Ġo 2 . due Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompare Values ( o 1 . created Date , Ġo 2 . created Date ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġshould Display ( task : Task ): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( task . status ==" completed " Ġ|| Ġtask . status ==" deleted " Ġ|| Ġtask . status ==" recurring " Ġ|| Ġtask . status ==" waiting ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġtask . wait Date ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( date Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( date . before ( Date ()) Ġ&& Ġtask . status ==" waiting "){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . status =" pending " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġshould Display Show Waiting ( task : Task ): Boolean { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(!( task . status ==" completed " Ġ|| Ġtask . status ==" deleted " Ġ|| Ġtask . status ==" recurring " Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠtoJson ( task : Task ): String { ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . v (" bright task ", Ġ" to json ing : Ġ"+ task . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" description ", Ġtask . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put (" uuid ", Ġtask . uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" project ", Ġtask . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" status ", Ġtask . status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" priority ", Ġtask . priority ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . due Date != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" due ", ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). format ( task . due Date )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . wait Date != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" wait ", ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). format ( task . wait Date )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task . modified Date != null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" modified ", ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). format ( task . modified Date )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" created ", ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). format ( task . created Date )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt (" tags ", ĠJSONArray ( task . tags )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( extra Ġin Ġtask . others ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . put Opt ( extra . key , Ġextra . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġun escape ( str : String ): String Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr . replace ("\\ ", Ġ"") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom Json ( json : String ): Task ? { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠTask ("") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġobj Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobj Ġ= ĠJSONObject ( json ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( this . java Class . toString (), Ġ" Skipping Ġtask Ġimport : Ġ"+ ex . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . name Ġ= Ġobj . opt String (" description ") ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . uuid Ġ= ĠUUID . fromString ( obj . getString (" uuid ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . project Ġ= Ġobj . opt String (" project ") Ġ?: Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . status Ġ= Ġobj . opt String (" status ") Ġ?: Ġ" pending " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . priority Ġ= Ġobj . opt String (" priority ") Ġ?: Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġconv Date Ġ: ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconv Date Ġ= Ġobj . opt String (" due ") ?: "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! conv Date . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . due Date Ġ= ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). parse ( conv Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconv Date Ġ= Ġobj . opt String (" modified ") ?: "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! conv Date . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . modified Date Ġ= ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). parse ( conv Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconv Date Ġ= Ġobj . opt String (" created ") ?: "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! conv Date . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . created Date Ġ= ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). parse ( conv Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconv Date Ġ= Ġobj . opt String (" wait ") ?: "" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! conv Date . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . wait Date Ġ= ĠSimpleDateFormat (" yyyy MM dd ' T ' HH mm ss ' Z ' "). parse ( conv Date ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjs ont ags Ġ= Ġobj . opt JSONArray (" tags ") ?: ĠJSONArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġ 0 Ġuntil Ġjs ont ags . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . tags . add ( js ont ags . getString ( j )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// remove Ġwhat Ġwe Ġhave Ġspecific Ġfields Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" description ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" uuid ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" project ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" status ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" priority ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" due ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" modified ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" created ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" tags ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobj . remove (" wait ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// add Ġall Ġothers Ġto Ġthe Ġothers Ġmap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( key Ġin Ġobj . keys ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout . others [ key ] Ġ= Ġun escape ( obj . getString ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }