package Ġru . dy ate l . ts us chedule . database Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . sqlite . SQLite Database Ċ import Ġh iron del le . date 4 j . DateTime Ċ import Ġorg . jetbrains . ank o . db . AUTO INCREMENT Ċ import Ġorg . jetbrains . ank o . db . DEFAULT Ċ import Ġorg . jetbrains . ank o . db . INTEGER Ċ import Ġorg . jetbrains . ank o . db . Long Parser Ċ import Ġorg . jetbrains . ank o . db . Map Row Parser Ċ import Ġorg . jetbrains . ank o . db . PRIMARY _ KEY Ċ import Ġorg . jetbrains . ank o . db . Sql Order Direction Ċ import Ġorg . jetbrains . ank o . db . TEXT Ċ import Ġorg . jetbrains . ank o . db . createTable Ċ import Ġorg . jetbrains . ank o . db . drop Table Ċ import Ġorg . jetbrains . ank o . db . select Ċ import Ġorg . jetbrains . ank o . db . update Ċ import Ġru . dy ate l . ts us chedule . model . Group Lesson Ċ import Ġru . dy ate l . ts us chedule . model . Schedule Snapshot Ċ import Ġru . dy ate l . ts us chedule . utilities . schedule Preferences Ċ import Ġjava . util . TimeZone Ċ Ċ class ĠSchedule Snapshot Dao ( context : ĠContext , Ġdatabase Manager : ĠDatabase Manager ) Ġ: ĠDatabase Part ( database Manager ) Ġ{ ĊĊĠĠĠ Ġobject ĠColumns Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠID Ġ= Ġ" id " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠGROUP Ġ= Ġ" group _ index " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTIMESTAMP Ġ= Ġ" timestamp " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠHASH Ġ= Ġ" hash " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPIN N ED Ġ= Ġ" pinned " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSELECT ED Ġ= Ġ" selected " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTABLE Ġ= Ġ" schedule _ snapshots " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠROW _ PARSER Ġ= Ġobject Ġ: ĠMap Row Parser < Schedule Snapshot > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġparse Row ( columns : ĠMap < String , ĠAny ?> ): ĠSchedule Snapshot Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSchedule Snapshot ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ Columns . ID ] Ġas ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ Columns . GROUP ] Ġas ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ Columns . TIMESTAMP ] Ġas ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( columns [ Columns . PIN N ED ] Ġas ĠLong ). as Flag (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( columns [ Columns . SELECTED ] Ġas ĠLong ). as Flag ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpreferences Ġ= Ġcontext . schedule Preferences ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Tables ( db : ĠSQLite Database ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb . createTable ( TABLE , Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . ID Ġto ĠINTEGER Ġ+ ĠPRIMARY _ KEY Ġ+ ĠAUTO INCREMENT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . GROUP Ġto ĠTEXT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . TIMESTAMP Ġto ĠINTEGER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . HASH Ġto ĠINTEGER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . PIN N ED Ġto ĠINTEGER Ġ+ ĠDEFAULT ( false . toInt (). toString ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColumns . SELECTED Ġto ĠINTEGER Ġ+ ĠDEFAULT ( true . toInt (). toString ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupgrade Tables ( db : ĠSQLite Database , Ġold Version : ĠInt , Ġnew Version : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( old Version Ġ< Ġ 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . drop Table ( TABLE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Tables ( db ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrequest ( group : ĠString ): ĠList < Schedule Snapshot > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexecute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( TABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . GROUP } Ġ= Ġ?", Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Columns . ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse List ( ROW _ PARSER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsave ( group : ĠString , Ġless ons : ĠCollection < Group Lesson >) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimezone Ġ= ĠTime Zone . getDefault () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtimestamp Ġ= ĠDateTime . now ( timezone ). get Milliseconds ( timezone ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġless ons . sum By Ġ{ Ġit . hashCode () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( TABLE , ĠColumns . SELECTED Ġto Ġfalse . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . GROUP } Ġ= Ġ?", Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exec () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduplicate Ġ= Ġselect ( TABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . GROUP } Ġ= Ġ? ĠAND Ġ${ Columns . HASH } Ġ= Ġ?", Ġgroup , Ġhash . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Opt ( ROW _ PARSER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġdatabase Manager . raw Group Schedule . request ( it . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġless ons . size Ġ== Ġold . size Ġ&& Ġless ons . all Ġ{ Ġold . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Values Ġ= ĠContent Values (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Columns . GROUP , Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Columns . TIMESTAMP , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Columns . HASH , Ġhash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duplicate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Columns . PIN N ED , Ġduplicate . pinned . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġinsert ( TABLE , Ġnull , Ġcontent Values ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duplicate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . raw Group Schedule . transfer Snapshot ( duplicate . id , Ġid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove ( duplicate . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . raw Group Schedule . save ( id . toString (), Ġless ons ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Sur plus ( group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( duplicate Ġ== Ġnull Ġ|| Ġ! duplicate . selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . filtered Group Schedule . save ( group , Ġless ons ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate ( id : ĠLong , Ġpinned : ĠBoolean , Ġselected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( TABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . ID } Ġ= Ġ?", Ġid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( ROW _ PARSER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( TABLE , ĠColumns . PIN N ED Ġto Ġpinned . toInt (), ĠColumns . SELECTED Ġto Ġselected . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . ID } Ġ= Ġ?", Ġid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exec () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( TABLE , ĠColumns . SELECTED Ġto Ġfalse . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . GROUP } Ġ= Ġ? ĠAND Ġ${ Columns . ID } Ġ!= Ġ?", Ġold . group , Ġid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. exec () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! old . selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġless ons Ġ= Ġdatabase Manager . raw Group Schedule . request ( id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . filtered Group Schedule . save ( old . group , Ġless ons ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove ( id : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnapshot Ġ= Ġselect ( TABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . ID } Ġ= Ġ?", Ġid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse Single ( ROW _ PARSER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( snapshot . selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . filtered Group Schedule . remove ( snapshot . group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdatabase Manager . raw Group Schedule . remove ( id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( TABLE , Ġ"${ Columns . ID } Ġ= Ġ?", ĠarrayOf ( id . toString ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Sur plus ( group : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect ( TABLE , ĠColumns . ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. where Simple ("${ Columns . GROUP } Ġ= Ġ? ĠAND Ġ${ Columns . SELECTED } Ġ= Ġ 0 ĠAND Ġ${ Columns . PIN N ED } Ġ= Ġ 0 ", Ġgroup ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. orderBy ( Columns . ID , ĠSql Order Direction . DESC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. limit ( preferences . history Size , ĠInt . MAX _ VALUE ) Ġ// Ġ- 1 Ġis Ġnot Ġsupported Ġfor Ġsome Ġreason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. parse List ( Long Parser ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġremove ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ