package Ġcc . d udu hu o . q password . ui . activity Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Progress Dialog Ċ import Ġandroid . content . Component Name Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . Service Connection Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . os .* Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . widget . EditText Ċ import Ġcc . d udu hu o . application toast . App Toast Ċ import Ġcc . d udu hu o . q password . R Ċ import Ġcc . d udu hu o . q password . adapter . FileList Adapter Ċ import Ġcc . d udu hu o . q password . bean . Export Ċ import Ġcc . d udu hu o . q password . bean . Import File Ċ import Ġcc . d udu hu o . q password . bean . Password Ċ import Ġcc . d udu hu o . q password . config . Config Ċ import Ġcc . d udu hu o . q password . service . Main Binder Ċ import Ġcc . d udu hu o . q password . service . Main Service Ċ import Ġcc . d udu hu o . q password . service . listener . On Password s ChangeListener Ċ import Ġcc . d udu hu o . q password . util .* Ċ import Ġcc . d udu hu o . q password . widget . File Item Decoration Ċ import Ġcom . alibaba . fastjson . JSON Ċ import Ġkotlinx . android . synt hetic . main . activity _ import .* Ċ import Ġjava . io . File ĊĊ Ċ /** Ċ Ġ* Ġ================================================= ====== Ċ Ġ* ĠAuthor : Ġli ying Ġ- Ġli ru o er 2 0 0 8 @ ye ah . net Ċ Ġ* ĠDate time : Ġ 2 0 1 7 / 1 1 / 1 1 Ġ 2 2 : 5 6 Ċ Ġ* ĠDescription : Ġ å¯¼åħ¥ å¯Ĩçłģ ĠActivity Ċ Ġ* ĠRemark s : Ċ Ġ* Ġ================================================= ====== Ċ Ġ*/ Ċ class ĠImport Activity Ġ: ĠBase Activity (), ĠFile ListAdapter . On File ClickListener , ĠOn Password s ChangeListener Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġm Main Binder : ĠMain Binder ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Adapter : ĠFile ListAdapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Progress Dialog : ĠProgress Dialog ? Ġ= Ġnull ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠRESULT _ CODE _ IMPORT Ġ= Ġ 0 x 0 0 1 0 ĊĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" In lined Api ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPER MISSION Ġ= ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ PERMISSION Ġ= Ġ 0 x 0 0 0 0 ĊĠĠĠĠĠĠĠ Ġfun Ġget Intent ( context : ĠContext ): ĠIntent Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠImport Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Service Connection Ġ= Ġobject Ġ: ĠService Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Disconnected ( name : ĠComponent Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Main Binder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Main Binder !!. unregister On Password s ChangeListener ( this @ Import Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Main Binder Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Service Connected ( name : ĠComponent Name , Ġservice : ĠI Binder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Main Binder Ġ= Ġservice Ġas ĠMain Binder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Main Binder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ æ³¨åĨĮ å¯Ĩçłģ åıĺåĮĸ çĽĳåĲ¬ åĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Main Binder !!. register On Password s ChangeListener ( this @ Import Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Views () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ import ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaction Bar Ġ= Ġsupport ActionBar ĊĠĠĠĠĠĠĠ Ġaction Bar ?. set Display Home As Up Enabled ( true ) ĊĠĠĠĠĠĠĠ ĠsetTitle ( R . string . title _ import _ password ) ĊĠĠĠĠĠĠĠ Ġtv _ import _ msg . text Ġ= ĠgetString ( R . string . import _ password _ tip , ĠConfig . EXPORT _ FILE _ EXTENSION , ĠConfig . WORK _ DIR Ġ+ Ġ"/" Ġ+ ĠConfig . EXPORT _ DIR ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġ ç»ĳå®ļ æľįåĬ¡ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠMain Service . get Intent ( this ) ĊĠĠĠĠĠĠĠ Ġthis . bind Service ( intent , Ġm Service Connection , ĠB IND _ AUTO _ CREATE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġæ£Ģ æŁ¥ æĿĥéĻĲ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Permission Granted ( PERMISSION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ çĶ³è¯· æĿĥéĻĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Show Permission R ationale ( PERMISSION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( main _ layout , ĠR . string . permission _ read _ ration ale , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . LENGTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( PERMISSION , ĠREQUEST _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission ( PERMISSION , ĠREQUEST _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Data ( refresh : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsd Path Ġ= ĠEnvironment . get External Storage Directory (). absolute Path ĊĠĠĠĠĠĠĠ Ġval Ġexport Path Ġ= Ġsd Path Ġ+ ĠFile . separator Ġ+ ĠConfig . WORK _ DIR Ġ+ ĠFile . separator Ġ+ ĠConfig . EXPORT _ DIR ĊĠĠĠĠĠĠĠ Ġval Ġexport Path File Ġ= ĠFile ( export Path ) ĊĠĠĠĠĠĠĠ Ġ// Ġæ£Ģ æŁ¥ Ġexport Path Ġæĺ¯åĲ¦ åŃĺåľ¨ ï¼Į ä¸įåŃĺåľ¨ åĪĻ åĪĽå»º ĊĠĠĠĠĠĠĠ Ġif Ġ(! export Path File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexport Path File . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġget Files ( export Path File ) ĊĠĠĠĠĠĠĠ Ġif Ġ( files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( getString ( R . string . search _ files _ fail , ĠConfig . EXPORT _ FILE _ EXTENSION , ĠConfig . WORK _ DIR Ġ+ Ġ"/" Ġ+ ĠConfig . EXPORT _ DIR )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( refresh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter ?. refresh ( files ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter Ġ= ĠFile ListAdapter ( this , Ġfiles ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġè®¾ç½® æĸĩä»¶ åĲį çĤ¹åĩ» çĽĳåĲ¬ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. setOn File ClickListener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv _ file . layout Manager Ġ= Ġandroidx . recyclerview . widget . Linear LayoutManager ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv _ file . addItem Decoration ( File Item Decoration ( this )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrv _ file . adapter Ġ= Ġm Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éģįåİĨ çĽ®æłĩ æĸĩä»¶ ä¸ĭ çļĦæĸĩä»¶ ï¼Į æī¾åĪ° æī©å±ķ åĲį çĽ¸ ç¬¦ çļĦæĸĩä»¶ ĊĠĠĠĠ Ġ* Ġ@ param Ġdirs ĠéľĢè¦ģ éģįåİĨ çļĦæīĢæľī æĸĩä»¶å¤¹ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Files ( var arg Ġdirs : ĠFile ): ĠMutable List < Import File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile List Ġ= Ġmutable ListOf < Import File >() ĊĠĠĠĠĠĠĠ Ġ// Ġæĸĩä»¶ æī©å±ķ åĲį ï¼Ī ä¸į åĮħæĭ¬ Ġ. ï¼ī ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= ĠConfig . EXPORT _ FILE _ EXTENSION . substring ( 1 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( dir Ġin Ġdirs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdir . walk (). max Depth ( 1 ). filter Ġ{ Ġit . isFile Ġ}. filter Ġ{ Ġit . extension Ġ== Ġextension Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġfile List . add ( Import File ( it . name , Ġit . absolute Path , Ġit . length ())) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfile List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĤ¹åĩ» æĸĩä»¶ åĲį ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon File Click ( absolute Path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexport : ĠExport ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġshow Progress Dialog ( getString ( R . string . parsing _ password _ file )) ĊĊĠĠĠĠĠĠĠ Ġval ĠreadFile Task Ġ= Ġ@ Suppress Lint (" Static Field Leak ") ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠAsync Task < Void , ĠVoid , ĠInt >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠVoid ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexport Ġ= ĠJSON . parse Object ( File ( absolute Path ). read Text (), ĠExport :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠInt ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss Progress Dialog () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( R . string . import _ file _ fail ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( export Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( export !!. is Encrypted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this @ Import Activity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġlayout Inflater . inflate ( R . layout . dialog _ enter _ key , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setView ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Key Ġ= Ġview . findViewById < EditText >( R . id . et _ enter _ key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . setTitle ( R . string . import _ enter _ key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( R . string . ok , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( R . string . cancel , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġbuilder . create () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set Canceled On Touch Outside ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . get Button ( AlertDialog . BUTTON _ NEGATIVE ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . get Button ( AlertDialog . BUTTON _ POSITIVE ). setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġori Key Ġ= Ġet Key . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ori Key . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( R . string . import _ key _ can _ not _ be _ empty ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ori Key . sha 1 Hex () Ġ== Ġexport !!. key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Password ( export !!. passwords , Ġori Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( R . string . import _ key _ wrong ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ setOnClickListener ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Password ( export !!. passwords ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġregister AsyncTask ( Import Activity :: class . java , ĠreadFile Task ) ĊĠĠĠĠĠĠĠ ĠreadFile Task . execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éķ¿ æĮī æĸĩä»¶ åĲį ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon File Long Click ( position : ĠInt , Ġabsolute Path : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġabsolute Path . split ( File . separator ). last () ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( this ) ĊĠĠĠĠĠĠĠ Ġbuilder . setTitle ( R . string . delete _ file ) ĊĠĠĠĠĠĠĠ Ġbuilder . setMessage ( getString ( R . string . delete _ file _ message , ĠfileName )) ĊĠĠĠĠĠĠĠ Ġbuilder . set Negative Button ( R . string . delete ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġok Ġ= ĠFile ( absolute Path ). delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ok ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĪ·æĸ° ĠRecyclerView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Adapter !!. removeItem ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠåĪłéĻ¤ æĸĩä»¶ å¤±è´¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( rv _ file , ĠR . string . delete _ fail , ĠSn ackbar . LENGTH _ LONG ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( R . string . refresh _ file _ list ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Data ( refresh Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . set Positive Button ( R . string . cancel ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġop ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġbuilder . create (). show () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¼åħ¥ å¯Ĩçłģ ĊĠĠĠĠ Ġ* Ġ@ param Ġpasswords Ġ å¯Ĩçłģ ĠList ĊĠĠĠĠ Ġ* Ġ@ param Ġori Key Ġ åĬłå¯Ĩ å¯Ĩ éĴ¥ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġimport Password ( passwords : ĠList < Password >, Ġori Key : ĠString ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpassword Count Ġ= Ġpasswords . size ĊĠĠĠĠĠĠĠ Ġif Ġ( password Count Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( R . string . import _ zero ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshow Progress Dialog ( getString ( R . string . import ing _ passwords , Ġpassword Count )) ĊĠĠĠĠĠĠĠ Ġif Ġ( ori Key Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæľī å¯Ĩ éĴ¥ ï¼Į åħĪ è§£ å¯Ĩ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpassword Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpasswords [ i ]. password Ġ= Ġpasswords [ i ]. password . aes Decrypt ( ori Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġ å¯¼åħ¥ å¯Ĩçłģ ĊĠĠĠĠĠĠĠ Ġm Main Binder ?. insert Password s ( passwords ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon New Password s ( passwords : ĠList < Password >) Ġ{ ĊĠĠĠĠĠĠĠ Ġdismiss Progress Dialog () ĊĊĠĠĠĠĠĠĠ ĠApp Toast . show Toast ( getString ( R . string . imported , Ġpasswords . size )) ĊĠĠĠĠĠĠĠ Ġset Result ( RESULT _ CODE _ IMPORT ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonDelete Password s ( passwords : ĠList < Password >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġop ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĤ¹åĩ» ActionBar è¿ĶåĽŀ åĽ¾ æłĩ åĽŀ åĪ° ä¸Ĭ ä¸Ģä¸ª Activity ĊĠĠĠĠ Ġ* Ġ@ param Ġitem ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item . itemId Ġ== Ġandroid . R . id . home ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < out ĠString >, Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ PERMISSION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results . contains Only ( PackageManager . PERMISSION _ GRAN TED )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Data () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( main _ layout , ĠR . string . read _ permission _ not _ gr anted , ĠSn ackbar . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ æĺ¾ç¤º ĠProgress Dialog ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġ æĺ¾ç¤º çļĦä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Progress Dialog ( message : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Progress Dialog Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog Ġ= ĠProgress Dialog ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog !!. set Cancel able ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Progress Dialog !!. setMessage ( message ) ĊĠĠĠĠĠĠĠ Ġm Progress Dialog !!. show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åıĸæ¶Ī ĠProgress Dialog ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdismiss Progress Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Finish ing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Progress Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Progress Dialog !!. is Showing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog !!. dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Progress Dialog Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġunregister AsyncTask ( Import Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġun bind Service ( m Service Connection ) ĊĠĠĠĠĠĠĠ Ġdismiss Progress Dialog () ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠ Ġ} Ċ Ċ } Ċ