package Ġcom . mer x ury . block er . ui . detail . app info Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġcom . el vis he w . x log . X Log Ċ import Ġcom . google . gson . Gson Ċ import Ġcom . mer x ury . block er . core . Component Controller Proxy Ċ import Ġcom . mer x ury . block er . core . root . E Controller Method Ċ import Ġcom . mer x ury . block er . rule . Rule Ċ import Ġcom . mer x ury . block er . rule . entity . Block er Rule Ċ import Ġcom . mer x ury . block er . util . Preference Util Ċ import Ġcom . mer x ury . block er . util . Storage Util Ċ import Ġcom . mer x ury . if w . util . Rule Serializer Ċ import Ġcom . mer x ury . lib kit . utils . FileUtils Ċ import Ġcom . mer x ury . lib kit . utils . Storage Utils Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Reader Ċ import Ġkotlinx . coroutines . Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ object ĠRule Backup Helper Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠX Log . tag (" Rule Backup Helper ") ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġimport ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO ĊĠĠĠ Ġ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved Path Ġ= ĠPreference Util . get Saved Rule Path ( context ) Ġ?: Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackup Name Ġ= ĠpackageName Ġ+ ĠRule . EXTENSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠDocument File . from Tree Uri ( context , Ġsaved Path ) Ġ?: Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackup File Ġ= Ġfolder . find File ( backup Name ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Backup Ġfile Ġ$ backup Name Ġnot Ġfound Ġin Ġfolder Ġ${ folder . uri }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( backup File . uri ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock er Rule Ġ= ĠGson (). fromJson ( reader , ĠBlock er Rule :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRule . import ( context , Ġblock er Rule ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . i (" Import Ġrule Ġ${ block er Rule . packageName } Ġfrom Ġ${ backup File . uri . path } Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġbackup File . uri ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġexport ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠRule . export ( context , ĠpackageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . i (" Export Ġrule Ġ$ packageName Ġsuccessfully ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Export Ġrule Ġ$ packageName Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġimport If w Rule ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO ĊĠĠĠ Ġ): ĠUri ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Uri Ġ= ĠPreference Util . get Saved Rule Path ( context ) Ġ?: Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Folder Ġ= ĠDocument File . from Tree Uri ( context , Ġbase Uri ) Ġ?: Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġif w Folder Ġ= Ġbase Folder . find File (" if w ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if w Folder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif w Folder Ġ= Ġbase Folder . create Directory (" if w ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if w Folder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Can Ġnot Ġcreate Ġif w Ġfolder Ġin Ġ$ base Folder ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbackup File Ġ= Ġif w Folder . find File ( packageName Ġ+ ĠRule . IF W _ EXTENSION ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Backup Ġfile Ġ$ packageName Ġnot Ġfound Ġin Ġfolder Ġ${ base Folder . uri }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= ĠComponent Controller Proxy . getInstance ( E Controller Method . IF W , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . content Resolver . open InputStream ( backup File . uri )?. use Ġ{ Ġstream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Ġ= ĠRule Serializer . deserialize ( stream ) Ġ?: Ġreturn @ use ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRule . update If w State ( rule , Ġcontroller ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . i (" Import Ġif w Ġrule Ġ$ packageName Ġsuccess ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġbackup File . uri ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġsuspend Ġfun Ġexport If w Rule ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ ĠpackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġdispatcher : ĠCor outine Dispatcher Ġ= ĠDispatch ers . IO ĊĠĠĠ Ġ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Context ( dispatcher ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif w Folder Ġ= ĠStorage Utils . get If w Folder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠFileUtils . list Files ( if w Folder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġif w File Ġ= Ġfiles . filter Ġ{ Ġit . contains ( packageName ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( if w File . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . e (" Can 't Ġfile ĠIF W Ġrule Ġin Ġ$ if w Folder , Ġpackage Ġ= Ġ$ packageName ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif w File . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . i (" Export Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġit . split ( File . separator ). last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠFileUtils . read ( if w Folder Ġ+ Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStorage Util . save If w To Storage ( context , Ġfilename , Ġcontent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . i (" Export Ġ$ it Ġfailed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with Context ĠPreference Util . get If w Rule Path ( context )?. path Ġ+ ĠFile . separator Ġ+ Ġif w File . first OrNull () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }