package Ġcom . l my . file Ċ Ċ import Ġcom . l my . common . ext . file Count Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . Copy On Write ArrayList Ċ Ċ interface ĠDis cover er Ġ: ĠFile Manager Ġ{ ĊĠĠĠ Ġfun Ġof (): ĠDis cover er ĊĠĠĠ Ġfun Ġopen ( path : ĠString , Ġresult : Ġ( files : ĠArray < String > ?) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġlist ( result : Ġ( files : ĠArray < String > ?) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġback ( result : Ġ( files : ĠArray < String > ?) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġcopy Syn ( src : ĠString , Ġdest : ĠString , Ġnotify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġmove Syn ( src : ĠString , Ġdest : ĠString , Ġnotify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġdelete Syn ( file : ĠString , Ġnotify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġwatch ( file : ĠString , Ġnotify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) ĊĠĠĠ Ġfun Ġun watch ( file : ĠString , Ġnotify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) ĊĊĠĠĠ Ġclass ĠWatch er ( private Ġval Ġmanager : ĠFile Manager , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsrc : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġdest : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġtype : ĠOper ate Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠCopy On Write ArrayList <( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtotal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcount Ġ= Ġ 0 ĊĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= ĠFile ( src ). file Count () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( 0 f , Ġ 0 , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper ate Type . COPY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . copy ( src , Ġdest ) Ġ{ Ġprogress , Ġindex , Ġcur Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit ( count Ġ/ Ġtotal . toFloat (), Ġcount , Ġcur Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper ate Type . MOVE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . move ( src , Ġdest ) Ġ{ Ġprogress , Ġindex , Ġcur Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit ( count Ġ/ Ġtotal . toFloat (), Ġcount , Ġcur Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOper ate Type . DELETE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmanager . delete ( src ) Ġ{ Ġprogress , Ġindex , Ġcur Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ( count Ġ/ Ġtotal . toFloat (), Ġcount , Ġcur Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ret ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit ( 1 f , Ġ 0 , Ġ" Success ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit (- 1 f , Ġ 0 , Ġ" Failed ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġwatch ( notify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . add ( notify ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġun watch ( notify : Ġ( progress : ĠFloat , Ġindex : ĠInt , Ġcur Name : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . remove ( notify ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcopy ( manager : ĠFile Manager , Ġsrc : ĠString , Ġdest : ĠString ): ĠWatch er Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWatch er ( manager , Ġsrc , Ġdest , ĠOper ate Type . COPY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġmove ( manager : ĠFile Manager , Ġsrc : ĠString , Ġdest : ĠString ): ĠWatch er Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWatch er ( manager , Ġsrc , Ġdest , ĠOper ate Type . MOVE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġdelete ( manager : ĠFile Manager , Ġfile : ĠString ): ĠWatch er Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠWatch er ( manager , Ġfile , Ġ"", ĠOper ate Type . DELETE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠOper ate Type Ġ{ ĊĠĠĠĠĠĠĠ ĠCOPY , ĠMOVE , ĠDELETE ĊĠĠĠ Ġ} Ċ }