package Ġcom . tom cl aw . draw a . draw Ċ Ċ import Ġandroid . view . Motion Event Ċ import Ġcom . tom cl aw . draw a . draw . tools . Tool Ċ import Ġcom . tom cl aw . draw a . util . Logger Ċ import Ġcom . tom cl aw . draw a . util . history File Ċ import Ġcom . tom cl aw . draw a . util . safe Close Ċ import Ġio . reactivex . Single Ċ import Ġjava . io . Buffered InputStream Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . Data InputStream Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . util . Array Deque Ċ import Ġjava . util . Deque Ċ Ċ interface ĠHistory Ġ{ ĊĊĠĠĠ Ġfun Ġadd ( tool : ĠTool , Ġx : ĠInt , Ġy : ĠInt , Ġaction : ĠInt ): ĠEvent ĊĊĠĠĠ Ġfun Ġundo () ĊĊĠĠĠ Ġfun Ġclear () ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean ĊĊĠĠĠ Ġfun Ġget Events Count (): ĠInt ĊĊĠĠĠ Ġfun Ġget Events (): ĠIterator < Event > ĊĊĠĠĠ Ġfun Ġsave (): ĠSingle < Unit > ĊĊĠĠĠ Ġfun Ġload (): ĠSingle < Unit > ĊĊĠĠĠ Ġfun Ġduplicate ( record Id : ĠInt ): ĠSingle < Unit > ĊĊĠĠĠ Ġfun Ġdelete (): ĠSingle < Unit > Ċ Ċ } Ċ Ċ class ĠHistory Impl ( ĊĠĠĠĠĠĠĠ Ġrecord Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfiles Dir : ĠFile , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger : ĠLogger Ċ ) Ġ: ĠHistory Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġevents : ĠDe que < Event > Ġ= ĠArray Deque () ĊĠĠĠ Ġprivate Ġvar Ġevent Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval Ġfile : ĠFile Ġ= Ġhistory File ( record Id , Ġfiles Dir ) ĊĊĠĠĠ Ġoverride Ġfun Ġadd ( tool : ĠTool , Ġx : ĠInt , Ġy : ĠInt , Ġaction : ĠInt ): ĠEvent Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( action Ġ== ĠMotion Event . ACTION _ DOWN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Index ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġe Ġ= ĠEvent ( event Index , Ġtool . type , Ġtool . color , Ġtool . size , Ġx , Ġy , Ġaction ) ĊĠĠĠĠĠĠĠ Ġevents . push ( e ) ĊĠĠĠĠĠĠĠ Ġreturn Ġe ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġundo () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( event Index Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! events . isEmpty () Ġ&& Ġevents . peek ()?. index Ġ== Ġevent Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent Index -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġevents . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġevents . isEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġget Events Count (): ĠInt Ġ= Ġevents . size ĊĊĠĠĠ Ġoverride Ġfun Ġget Events (): ĠIterator < Event > Ġ= Ġevents . desc ending Iterator () ĊĊĠĠĠ Ġoverride Ġfun Ġsave (): ĠSingle < Unit > Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġevents Ġ= ĠArrayList ( events ) ĊĠĠĠĠĠĠĠ Ġvar Ġoutput : ĠData OutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ= ĠData OutputStream ( Buffered OutputStream ( File OutputStream ( file ), ĠBUFFER _ SIZE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( output ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( BACKUP _ VERSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( event Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( events . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġtool Type , Ġcolor , Ġradius , Ġx , Ġy , Ġaction ) Ġin Ġevents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( tool Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Short ( radius ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Short ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Short ( y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Byte ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" total Ġ% d Ġevents Ġ(% d Ġbytes ) Ġwritten Ġin Ġ% d Ġms ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents . size , Ġfile . length (), Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . safe Close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload (): ĠSingle < Unit > Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġvar Ġinput : ĠData InputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtime Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Ġ= ĠData InputStream ( Buffered InputStream ( FileInputStream ( file ), ĠBUFFER _ SIZE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackup Version Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( backup Version Ġ== ĠBACK UP _ VERSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent List Ġ= ĠArrayList < Event >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Index Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevents Count Ġ= Ġinput . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( input ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġ 0 Ġuntil Ġevents Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġread Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtool Type Ġ= Ġread Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġread Int () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġread Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġread Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġread Short () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġread Byte () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtool Type . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy . toInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent List . add ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . event Index Ġ= Ġevent Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . events . addAll ( event List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Ġ= ĠSystem . currentTimeMillis () Ġ- Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" total Ġ% d Ġevents Ġ(% d Ġbytes Ġread ) Ġin Ġ% d Ġms ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevents Count , Ġfile . length (), Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . on Success ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter . onError ( IOException (" backup Ġformat Ġof Ġunknown Ġversion ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . safe Close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġduplicate ( record Id : ĠInt ): ĠSingle < Unit > Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġhistory File ( record Id , Ġfiles Dir ) ĊĠĠĠĠĠĠĠ Ġfile . copy To ( target Ġ= Ġtarget , Ġoverwrite Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġemitter . on Success ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete (): ĠSingle < Unit > Ġ= ĠSingle . create Ġ{ Ġemitter Ġ-> ĊĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġemitter . on Success ( Unit ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġconst Ġval ĠBACK UP _ VERSION Ġ= Ġ 1 Ċ private Ġconst Ġval ĠBUFFER _ SIZE Ġ= Ġ 5 1 2 Ġ* Ġ 1 0 2 4 Ċ