package Ġde . s me urer . file mo ver . ui Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . support . v 7 . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġcom . mark ode vc ic . pe ko . P ek o Ċ import Ġde . s me urer . file mo ver . data . Mode Ċ import Ġde . s me urer . file mo ver . data . Move Config Ċ import Ġio . paper db . Paper Ċ import Ġio . reactivex . rx kotlin . subscribe By Ċ import Ġio . reactivex . rx kotlin . to Observable Ċ import Ġkotlinx . coroutines . experimental . android . UI Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġorg . jetbrains . ank o . toast Ċ import Ġorg . joda . time . DateTime Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . channels . File Channel Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠSimon ĠMe urer Ġon Ġ 1 6 . 0 4 . 1 8 . Ċ Ġ*/ Ċ abstract Ġclass ĠAbstract Base Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġfun Ġsave Move Config ( move Config : ĠMove Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfigs Ġ= Ġget Move Configs Set () ĊĠĠĠĠĠĠĠ ĠPaper . book (). write (" configs ", Ġconfigs . plus ( move Config )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Move Config ( move Config : ĠMove Config ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfigs Ġ= Ġget Move Configs Set () ĊĠĠĠĠĠĠĠ ĠPaper . book (). write (" configs ", Ġconfigs . minus ( move Config )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Move Configs (): ĠList < Move Config > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Move Configs Set (). toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Move Configs Set (): ĠSet < Move Config > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPaper . book (). read (" configs ") ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġrun Move Config ( move Config : ĠMove Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlaunch ( UI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpermission Result Deferred Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠP ek o . request Permissions Async ( this @ Abstract Base Activity , ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( gr anted Permissions ) Ġ= Ġpermission Result Deferred . await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Manifest . permission . WRITE _ EXTERNAL _ STORAGE Ġin Ġgranted Permissions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Move Config ( move Config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast (" Sorry Ġwe Ġneed Ġaccess Ġto Ġstorage !") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Move Config ( move Config : ĠMove Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= ĠFile ( move Config . from Path ) ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġdirectory . list Files () ĊĠĠĠĠĠĠĠ ĠLog . d (" Files ", Ġ" All Ġfiles : Ġ" Ġ+ Ġfiles . size ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfiles . to Observable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġf Ġ-> Ġmove Config . extensions . contains ( f . extension ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. do On Each Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy File ( file . value !!. absolute Path , Ġmove Config . to Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move Config . mode Ġ== ĠMode . move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . value !!. delete ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. subscribe By ( onComplete Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( move Config . mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . move Ġ-> Ġtoast (" Moved Ġ$ i Ġfiles ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMode . copy Ġ-> Ġtoast (" Copied Ġ$ i Ġfiles ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove Config . last Run At Ġ= ĠDateTime . now () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave Move Config ( move Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcopy File ( src File : ĠString , Ġdst Dir : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d (" COPY ", Ġ" From Ġ$ src File Ġto Ġ$ dst Dir "); ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠFile ( src File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdst Ġ= ĠFile ( dst Dir , Ġsrc . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy File ( src , Ġdst ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcopy File ( source File : ĠFile , Ġdest File : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! dest File . parent File . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest File . parent File . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! dest File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest File . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsource : ĠFile Channel ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdestination : ĠFile Channel ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= ĠFileInputStream ( source File ). channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination Ġ= ĠFileOutputStream ( dest File ). channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdestination !!. transfer From ( source , Ġ 0 , Ġsource !!. size ()) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( destination Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }