package Ġcom . mean . trac lock . view models Ċ Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . lifecycle . ViewModel Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġcom . mean . trac lock . App Ċ import Ġcom . mean . trac lock . database . App Database Ċ import Ġcom . mean . trac lock . database . Project Ċ import Ġcom . mean . trac lock . database . Record Ċ import Ġcom . mean . trac lock . utils . Database Ċ import Ġcom . mean . trac lock . utils . T Log Ċ import Ġcom . mean . trac lock . utils . getInt Date Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . Buffered Writer Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . OutputStream Writer Ċ Ċ class ĠBackup Restore ViewModel Ġ: ĠViewModel () Ġ{ ĊĠĠĠ Ġval Ġshow Confirm Dialog Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġbacking Up Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġrest oring Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġshow Backup Dialog Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġval Ġshow Restore Dialog Ġ= ĠMutable State Flow ( false ) ĊĠĠĠ Ġprivate Ġvar Ġrestore Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠ Ġval Ġprogress Ġ= ĠMutable State Flow ( 0 F ) ĊĊĠĠĠ Ġfun Ġset Restore Uri ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrestore Uri Ġ= Ġuri ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbackup ( uri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġshow Backup Dialog . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġbacking Up . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecords Ġ= ĠApp Database . get Database ( App . context ). record Dao (). get Records List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= ĠApp . projects . size Ġ+ Ġrecords . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdone Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp . context . content Resolver . open OutputStream ( uri ). use Ġ{ ĠoutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBuffered Writer ( OutputStream Writer ( output Stream )). use Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write (" Project , Start ĠTime , End ĠTime \ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( project Ġin ĠApp . projects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( project . key Ġ+ Ġ", - 1 ," Ġ+ Ġproject . value Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġdone ++. toFloat () Ġ/ Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( record Ġin Ġrecords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwriter . write ( record . project Ġ+ Ġ"," Ġ+ Ġrecord . startTime Ġ+ Ġ"," Ġ+ Ġrecord . endTime Ġ+ Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġdone ++. toFloat () Ġ/ Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġ 1 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbacking Up . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrestore () Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġshow Restore Dialog . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġrest oring . value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġlines Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġdone Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrestore Uri ?. let Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel Scope . launch ( Dispatch ers . IO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . context . content Resolver . open InputStream ( uri )?. use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( inputStream )). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlines Ġ= Ġit . read Lines (). size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp . context . content Resolver . open InputStream ( uri )?. use Ġ{ ĠinputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBufferedReader ( InputStream Reader ( inputStream )). use Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . readLine () Ġ// Ġ åİ» æİī ç¬¬ä¸Ģ è¡Į ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdone ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( line Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġrestore ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġdone ++. toFloat () Ġ/ Ġlines ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ= Ġreader . readLine () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress . value Ġ= Ġ 1 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrest oring . value Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore ( line : ĠString ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcolumns Ġ= Ġline . split (",") ĊĠĠĠĠĠĠĠ Ġ// Ġ é¡¹çĽ® Ġ- 1 Ġ é¢ľèī² ĊĠĠĠĠĠĠĠ Ġ// Ġ é¡¹çĽ® Ġ å¼Ģå§ĭ æĹ¶éĹ´ ï¼Ī 2 0 0 0 - 0 1 - 0 1 Ġ 0 0 : 0 0 : 0 0 ï¼ī Ġ ç»ĵæĿŁ æĹ¶éĹ´ ĊĠĠĠĠĠĠĠ Ġif Ġ( columns . size Ġ< Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 Ġ// Ġ åĪĹ æķ° éĶĻè¯¯ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠprojectName Ġ= Ġcolumns [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( projectName . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 2 Ġ// Ġ é¡¹çĽ® åĲį ä¸ºç©º ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠstartTime Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ 1 ]. to Long () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠT Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( startTime Ġ== Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ 2 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT Log . e ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDatabase . insert Project ( Project ( projectName , Ġcolor )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġget Int Date ( startTime ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠendTime Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumns [ 2 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= ĠRecord ( projectName , ĠstartTime , ĠendTime , Ġdate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Database . insert Record ( record )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} Ċ } Ċ