package Ġr yn k bit . tk . co ffe elist . ui . admin . backup . create ĊĊ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġandroidx . lifecycle . observe Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġkotlinx . android . synt hetic . main . fragment _ create _ backup .* Ċ import Ġorg . json . JSONObject Ċ import Ġr yn k bit . tk . co ffe elist . R Ċ import Ġr yn k bit . tk . co ffe elist . db . facade . Customer Facade Ċ import Ġr yn k bit . tk . co ffe elist . db . facade . Invoice Facade Ċ import Ġr yn k bit . tk . co ffe elist . db . facade . Item Facade Ċ import Ġr yn k bit . tk . co ffe elist . json . JSON Customer Converter Ċ import Ġr yn k bit . tk . co ffe elist . json . JSON Invoice Converter Ċ import Ġr yn k bit . tk . co ffe elist . json . JSON Item Converter Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . charset . Charset Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġ[ Fragment ] Ġsubclass . Ċ Ġ*/ Ċ class ĠCreate Backup Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOPEN _ REQUEST _ CODE Ġ= Ġ 4 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview model : ĠCreate Backup ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( in flater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ?): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ create _ backup , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġview model Ġ= ĠViewModel Provider ( this )[ Create Backup ViewModel :: class . java ] ĊĊĠĠĠĠĠĠĠ Ġview model . current Uri . observe ( this ) Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Current Path . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxt Current Path . text Ġ= Ġuri . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Write Backup . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Write Backup . isEnabled Ġ= Ġuri . path Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Write Backup . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġbtn Select Path . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ CREATE _ DOCUMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ"* /* " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ TITLE , Ġ" backup . coffee ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠOPEN _ REQUEST _ CODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Write Backup . text Ġ= ĠgetString ( R . string . loading _ data ) ĊĠĠĠĠĠĠĠ Ġbtn Write Backup . isEnabled Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġbtn Write Backup . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠJSONObject () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . put (" version ", Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . put (" customers ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Customer Converter (). convert Many To JSON ( view model . customers . value !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . put (" items ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Item Converter (). convert Many To JSON ( view model . items . value !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . put (" invoices ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJSON Invoice Converter (). convert Many To JSON ( view model . invoices . value !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Backup ( root . toString (). toByteArray ( Charset . default Charset ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview model . customers Ġ= ĠCustomer Facade (). findAll () ĊĠĠĠĠĠĠĠ Ġview model . items Ġ= ĠItem Facade (). findAll () ĊĠĠĠĠĠĠĠ Ġview model . invoices Ġ= ĠInvoice Facade (). findAll () ĊĊĠĠĠĠĠĠĠ Ġview model . customers . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Data Ready () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview model . items . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Data Ready () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview model . invoices . observe ( this ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Data Ready () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Data Ready () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( view model . customers . value Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview model . items . value Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview model . invoices . value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Write Backup . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Write Backup . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbtn Write Backup . text Ġ= ĠgetString ( R . string . write _ backup ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Backup ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( view model . current Uri . value Ġ== Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Path Not Set () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. open FileDescriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview model . current Uri . value !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" w " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . use Ġ{ ĠfileDescriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileOutputStream ( file Descriptor . file Descriptor ). use Ġ{ Ġfile OutputStream Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile OutputStream . write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} catch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Path Not Set () Ġ{ ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( view !! , ĠR . string . path _ not _ set , ĠSn ackbar . LENGTH _ SHORT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġrequest Code Ġ== ĠOPEN _ REQUEST _ CODE Ġ&& Ġdata Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview model . current Uri . post Value ( data . data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ