// ĠSPDX - File Copyright Text : Ġ 2 0 1 9 , ĠAnd ras ĠVer es - Sz ent kir aly i Ġ< vs za @ vs za . hu > Ċ // ĠSPDX - License - Identifier : ĠMIT ĊĊ Ċ package Ġorg . hs bp . andro sphinx Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Activity Ċ import Ġandroid . app . Search Manager Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . InputType Ċ import Ġandroid . view . View Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . app . AlertDialog Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . widget . add TextChanged Listener Ċ import Ġcom . commons ware . cw ac . security . flag secure . Flag Secure Helper Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Malformed URLException Ċ import Ġjava . net . URL Ċ import Ġjava . util .* Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . aut ofill . Aut ofill Manager . EXTRA _ AS SIST _ STRUCTURE Ċ import Ġandroid . app . assist . Ass ist Structure Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . service . aut ofill . Dataset Ċ import Ġandroid . service . aut ofill . Fill Response Ċ import Ġandroid . text . format . Date Utils Ċ import Ġandroid . view . aut ofill . Aut ofill Manager Ċ import Ġandroid . view . aut ofill . Aut ofill Value Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġarrow . core . Either Ċ import Ġcom . nul ab inc . z xc v bn . Z xc v bn Ċ import Ġorg . hs bp . andro sphinx . databinding . Activity Accounts Binding Ċ import Ġkotlin . math . round To Long Ċ Ċ @ Suppress (" Spell Checking Inspection ") Ċ const Ġval ĠEX TRA _ ACCOUNT S _ AUT OF ILL Ġ= Ġ" org . hs bp . andro sphinx . Accounts Activity . EXTRA _ ACCOUNT S _ AUT OF ILL " Ċ Ċ class ĠAccounts Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcs Ġ= ĠAndroid Credential Store ( this ) ĊĠĠĠ Ġprivate Ġvar Ġauto Fill Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠActivity Accounts Binding ĊĊĠĠĠ Ġinner Ġclass ĠUpdate UserList Task ( private Ġval Ġhostname : ĠString ) Ġ: ĠAsync Task < Void , ĠVoid , ĠEither < Throwable , ĠSet < String >> >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . pull To Refresh . is Refresh ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠEither < Throwable , ĠSet < String >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . catch Ġ{ ĠProtocol . list ( hostname , Ġcs ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠEither < Throwable , ĠSet < String >>) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . pull To Refresh . is Refresh ing Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Server FailureException Ġ-> Ġhandle Error ( R . string . server _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS odium Exception Ġ-> Ġhandle Error ( R . string . s odium _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnknown Version Exception Ġ-> Ġhandle Error ( R . string . unknown _ version _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġhandle Error ( R . string . io _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġhandle Error ( R . string . unknown _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġresult . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġobjects Ġ= Ġif Ġ( users . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . user List . announce For Accessibility ( getString ( R . string . no _ users _ for _ host )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( User Proxy ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers . map (:: User Proxy ). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . user List . adapter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArray Adapter ( this @ Accounts Activity , Ġandroid . R . layout . simple _ list _ item _ 1 , Ġobjects ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Error ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠgetString ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . fab , Ġstring , ĠSn ackbar . LENGTH _ LONG ). setAction ( R . string . retry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUpdate UserList Task ( hostname ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fab . announce For Accessibility ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠUser Task ( private Ġval Ġfeedback Label : ĠTextView ) Ġ: ĠAsync Task < Void , ĠVoid , ĠEither < Throwable , ĠString >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġupdate Label ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠgetString ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . text Ġ= Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . announce For Accessibility ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Label ( R . string . connecting _ to _ server ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠEither < Throwable , ĠString > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . catch ( this :: run ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġrun (): ĠString ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġhandle Password ( pw : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠEither < Throwable , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Server FailureException Ġ-> Ġhandle Error ( R . string . server _ error _ password _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS odium Exception Ġ-> Ġhandle Error ( R . string . s odium _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Check Digit Mismatch Exception Ġ-> Ġhandle Error ( R . string . check _ digit _ mismatch _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnknown Version Exception Ġ-> Ġhandle Error ( R . string . unknown _ version _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġhandle Error ( R . string . io _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġhandle Error ( R . string . unknown _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġhandle Password ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Error ( message : ĠInt ) Ġ= Ġupdate Label ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġshow Snackbar ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= ĠgetString ( message ) ĊĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . fab , Ġmsg , ĠSn ackbar . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġbinding . fab . announce For Accessibility ( msg ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( 2 6 ) ĊĠĠĠ Ġinner Ġclass ĠAuto Fill Task ( master Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġalert Dialog : ĠAlertDialog , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label : ĠTextView ) Ġ: ĠGenerate Task ( master Password , Ġrealm , Ġalert Dialog , Ġfeedback Label ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Password ( pw : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstructure : ĠAss ist Structure Ġ= Ġintent . get Parcelable Extra ( EXTRA _ AS SIST _ STRUCTURE ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠS phinx Aut ofill Service . Parse Result () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS phinx Aut ofill Service . parse ( structure . getWindow Node At ( 0 ). root View Node , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremote View Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Views ( packageName , Ġandroid . R . layout . simple _ list _ item _ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset TextView Text ( android . R . id . text 1 , ĠgetString ( R . string . aut ofill _ remote _ button _ user _ text , Ġrealm . username )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= ĠDataset . Builder ( remote View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . username s . filter NotNull (). forEach Ġ{ Ġb . setValue ( it , ĠAut ofill Value . for Text ( realm . username )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . passwords . filter NotNull (). forEach Ġ{ Ġb . setValue ( it , ĠAut ofill Value . for Text ( pw )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfr Ġ= ĠFill Response . Builder (). add Dataset ( b . build ()). build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Ġ= ĠIntent (). putExtra ( Aut ofill Manager . EXTRA _ AUTHENT ICATION _ RESULT , Ġfr ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġreply ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . dismiss () Ġ// Ġif Ġwe Ġdon 't Ġclose Ġit Ġexplicitly , Ġan Ġexception Ġis Ġthrown Ġfor Ġle aking Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġinner Ġclass ĠGenerate Task ( private Ġval Ġmaster Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġalert Dialog : ĠAlertDialog , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label : ĠTextView ) Ġ: ĠUser Task ( feedback Label ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ= ĠProtocol . get ( master Password , Ġrealm , Ġcs ). second ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Password ( pw : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Password To Clipboard ( pw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . password _ copied _ to _ clipboard ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . dismiss () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠChange Task ( private Ġval Ġmaster Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label : ĠTextView ) Ġ: ĠUser Task ( feedback Label ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmaster Password Clone Ġ= Ġmaster Password . clone () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( r , Ġ_) Ġ= ĠProtocol . get ( master Password , Ġrealm , Ġcs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProtocol . change ( master Password Clone , Ġrealm , Ġr . char Classes , Ġcs , Ġr . symbols , Ġr . size . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Password ( pw : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Password To Clipboard ( pw ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Label ( R . string . password _ change _ mode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠUndo Task ( private Ġval Ġmaster Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label : ĠTextView ) Ġ: ĠUndo Commit Task ( feedback Label , ĠR . string . old _ password _ copied _ to _ clipboard ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ= ĠProtocol . undo ( master Password , Ġrealm , Ġcs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCommit Task ( private Ġval Ġmaster Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label : ĠTextView ) Ġ: ĠUndo Commit Task ( feedback Label , ĠR . string . new _ password _ copied _ to _ clipboard ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ= ĠProtocol . commit ( master Password , Ġrealm , Ġcs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġinner Ġclass ĠUndo Commit Task ( private Ġval Ġfeedback Label : ĠTextView , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsuccess Message : ĠInt ) Ġ: ĠAsync Task < Void , ĠVoid , ĠEither < Throwable , ĠUnit >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Label ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠgetString ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . text Ġ= Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . announce For Accessibility ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Label ( R . string . connecting _ to _ server ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠEither < Throwable , ĠUnit > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . catch ( this :: run ) ĊĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġrun () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠEither < Throwable , ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Server FailureException Ġ-> Ġupdate Label ( R . string . server _ error _ password _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS odium Exception Ġ-> Ġupdate Label ( R . string . s odium _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Check Digit Mismatch Exception Ġ-> Ġupdate Label ( R . string . check _ digit _ mismatch _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnknown Version Exception Ġ-> Ġupdate Label ( R . string . unknown _ version _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġupdate Label ( R . string . io _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Label ( R . string . unknown _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġupdate Label ( success Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Password To Clipboard ( pw : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclipboard Ġ= Ġget System Service ( Context . CLIP BOARD _ SERVICE ) Ġas ĠClip board Manager ĊĠĠĠĠĠĠĠ Ġval Ġclip Ġ= ĠClip Data . new Plain Text (" password ", Ġpw ) ĊĠĠĠĠĠĠĠ Ġclipboard . set Primary Clip ( clip ) ĊĠĠĠĠĠĠĠ ĠContext Compat . start Foreground Service ( this , ĠIntent ( this , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClip board Clean er Service :: class . java ). putExtra ( SERVICE _ COMMAND , ĠTimer State . START Ġas ĠParcel able )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠDelete Task ( private Ġval Ġmaster Password : ĠChar Array , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġalert Dialog : ĠAlertDialog , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġfeedback Label : ĠTextView ) Ġ: ĠAsync Task < Void , ĠVoid , ĠEither < Throwable , ĠUnit >>() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġupdate Label ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstring Ġ= ĠgetString ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . text Ġ= Ġstring ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeedback Label . announce For Accessibility ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Execute () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Label ( R . string . connecting _ to _ server ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠEither < Throwable , ĠUnit > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . catch Ġ{ ĠProtocol . delete ( master Password , Ġrealm , Ġcs ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠEither < Throwable , ĠUnit >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Server FailureException Ġ-> Ġupdate Label ( R . string . server _ error _ password _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS odium Exception Ġ-> Ġupdate Label ( R . string . s odium _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Check Digit Mismatch Exception Ġ-> Ġupdate Label ( R . string . check _ digit _ mismatch _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnknown Version Exception Ġ-> Ġupdate Label ( R . string . unknown _ version _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġupdate Label ( R . string . io _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġupdate Label ( R . string . unknown _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . user _ deleted ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalert Dialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UserList ( realm . hostname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠCreate Task ( private Ġval Ġmaster Password : ĠChar Array , Ġprivate Ġval Ġrealm : ĠProtocol . Realm , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġchar Classes : ĠSet < Character Class >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġsize : ĠInt ) Ġ: ĠAsync Task < Void , ĠVoid , ĠEither < Throwable , ĠString >>() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġp 0 : ĠVoid ?): ĠEither < Throwable , ĠString > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEither . catch Ġ{ ĠProtocol . create ( master Password , Ġrealm , Ġchar Classes , Ġcs , Ġsize ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Post Execute ( result : ĠEither < Throwable , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Left Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( result . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProtocol . Server FailureException Ġ-> Ġhandle Error ( R . string . server _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠS odium Exception Ġ-> Ġhandle Error ( R . string . s odium _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUnknown Version Exception Ġ-> Ġhandle Error ( R . string . unknown _ version _ title ) Ġ// Ġbecause Ġof Ġuser Ġlist Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIOException Ġ-> Ġhandle Error ( R . string . io _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġhandle Error ( R . string . unknown _ error _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠEither . Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UserList ( realm . hostname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Password To Clipboard ( result . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . password _ copied _ to _ clipboard ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġhandle Error ( message : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( binding . fab , Ġmessage , ĠSn ackbar . LENGTH _ LONG ). setAction ( R . string . retry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCreate Task ( master Password , Ġrealm , Ġchar Classes , Ġsize ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠActivity Accounts Binding . inflate ( layout Inflater ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( binding . root ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( binding . toolbar ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Intent . ACTION _ SEARCH Ġ== Ġintent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getString Extra ( Search Manager . QUERY )?. also Ġ{ Ġquery Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhostname Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( query ). host ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠMal formed URLException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġquery ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġhostname ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cs . isSet Up For Communication ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UserList ( hostname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( window . decor View , ĠR . string . no _ server _ setup , ĠSn ackbar . LENGTH _ LONG ). setAction ( R . string . open _ settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠSettings Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . user List . setOn ItemClickListener Ġ{ Ġadapter View , Ġ_, Ġi , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġusername Ġ= Ġ( adapter View . getItem At Position ( i ) Ġas ĠUser Proxy ). username ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( username Ġ!= Ġnull ) Ġshow User ( Protocol . Realm ( username , Ġhostname )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . fab . setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd User ( hostname , Ġview ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . accounts . pull To Refresh . setOn Refresh Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UserList ( hostname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġauto Fill Ġ= Ġintent . has Extra ( EXTRA _ ACCOUNT S _ AUT OF ILL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd User ( hostname : ĠString , Ġview : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! cs . isSet Up For Communication ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSn ackbar . make ( view , ĠR . string . no _ server _ setup , ĠSn ackbar . LENGTH _ LONG ). setAction ( R . string . open _ settings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( Intent ( this , ĠSettings Activity :: class . java )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlinear Layout Ġ= ĠLinearLayout ( this ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . orientation Ġ= ĠLinearLayout . VERTICAL ĊĠĠĠĠĠĠĠ Ġval Ġusername Ġ= ĠEditText ( this ) ĊĠĠĠĠĠĠĠ Ġusername . input Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ TEXT Ġor ĠInput Type . TYPE _ TEXT _ VARI ATION _ EMAIL _ ADDRESS ĊĠĠĠĠĠĠĠ Ġusername . set Hint ( R . string . add _ username _ placeholder ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( username ) ĊĠĠĠĠĠĠĠ Ġval Ġpassword Length Ġ= ĠEditText ( this ) ĊĠĠĠĠĠĠĠ Ġpassword Length . set Hint ( R . string . add _ password _ length _ placeholder ) ĊĠĠĠĠĠĠĠ Ġpassword Length . input Type Ġ= ĠInput Type . TYPE _ CLASS _ NUMBER ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( password Length ) ĊĠĠĠĠĠĠĠ Ġval Ġcc Widgets Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCharacter Class . values (). as Iterable (). associate With To ( Enum Map ( Character Class :: class . java )) Ġ{ Ġcc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcb Ġ= ĠCheckBox ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb . setText ( cc . description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Layout . addView ( cb ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcb ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠMap < Character Class , ĠCheckBox > ĊĠĠĠĠĠĠĠ Ġval Ġmaster Password s Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( R . string . master _ password , ĠR . string . master _ password _ confirm ). map Ġ{ Ġhint Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġet Ġ= ĠEditText ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet . input Type Ġ= ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD Ġor ĠInput Type . TYPE _ CLASS _ TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet . set Hint ( hint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlinear Layout . addView ( et ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġet ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġpassword Strength Meter Ġ= ĠTextView ( this ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( password Strength Meter ) ĊĊĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= Ġwith ( AlertDialog . Builder ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( R . string . add _ username _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( linear Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( R . string . add _ username _ btn ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrule Ġ= Ġcc Widgets . filter Values ( CheckBox :: isChecked ). keys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġpassword Length . text . toString (). toInt OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrealm Ġ= ĠProtocol . Realm ( username . text . toString (), Ġhostname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpw Ġ= Ġmaster Password s [ 0 ]. text . as CharArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Password s . forEach Ġ{ Ġit . text . clear () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCreate Task ( pw , Ġrealm , Ġrule , Ġsize ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Neutral Button ( android . R . string . cancel , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ}. create () ĊĊĠĠĠĠĠĠĠ ĠFlag Secure Helper . mark Dialog As Secure ( alert Dialog ). show () ĊĠĠĠĠĠĠĠ Ġval Ġbtn Ġ= Ġalert Dialog . get Button ( AlertDialog . BUTTON _ POSITIVE ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Enabled () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbtn . isEnabled Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusername . text . isNotEmpty () Ġand Ġcc Widgets . values . any ( CheckBox :: isChecked ) Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Password s [ 0 ]. text . as CharArray . content Equals ( master Password s [ 1 ]. text . as CharArray ) Ġand Ġmaster Password s [ 0 ]. text . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsequence Ġ{ Ġyield ( username ); Ġyield All ( master Password s ); Ġ}. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add TextChanged Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Enabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġz xc v bn Ġ= ĠZ xc v bn () ĊĠĠĠĠĠĠĠ Ġval Ġstrength Levels Ġ= ĠarrayOf ( R . string . password _ strength _ weak , ĠR . string . password _ strength _ fair , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . password _ strength _ good , ĠR . string . password _ strength _ strong , ĠR . string . password _ strength _ very _ strong ) ĊĊĠĠĠĠĠĠĠ Ġmaster Password s [ 0 ]. add TextChanged Listener Ġ{ Ġfield : ĠEdit able ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrength Ġ= Ġz xc v bn . measure ( field Ġ?: Ġreturn @ add TextChanged Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc ts Ġ= Ġstrength . cr ack Time Seconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠDate (). time ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr ack ed Ġ= Ġnow Ġ+ Ġ( cts . online Th rottling 1 0 0 per Hour Ġ* Ġ 1 0 0 0 ). round To Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Strength Meter . text Ġ= ĠgetString ( R . string . password _ strength _ format , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( strength Levels [ strength . score ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDate Utils . get Relative TimeSpan String ( cr ack ed , Ġnow , Ġ 0 L )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcc Widgets . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOn Checked ChangeListener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Enabled () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Enabled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow User ( realm : ĠProtocol . Realm , Ġfeedback Text : ĠInt ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlinear Layout Ġ= ĠLinearLayout ( this ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . orientation Ġ= ĠLinearLayout . VERTICAL ĊĊĠĠĠĠĠĠĠ Ġval Ġmaster Password Ġ= ĠEditText ( this ) ĊĠĠĠĠĠĠĠ Ġmaster Password . input Type Ġ= ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD Ġor ĠInput Type . TYPE _ CLASS _ TEXT ĊĠĠĠĠĠĠĠ Ġmaster Password . set Hint ( R . string . master _ password ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( master Password ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfeedback Label Ġ= ĠTextView ( this ) ĊĠĠĠĠĠĠĠ Ġif Ġ( feedback Text Ġ!= Ġnull ) Ġfeedback Label . setText ( feedback Text ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( feedback Label ) ĊĊĠĠĠĠĠĠĠ Ġval Ġbtn Auto Fill Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ generate _ aut ofill ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbtn Generate Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ generate _ copy ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbtn Change Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ generate _ change ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbtn Undo Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ undo _ change ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbtn Commit Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ commit _ change ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbtn Delete Ġ= ĠButton ( this ). apply Ġ{ Ġset Text ( R . string . btn _ delete _ user ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auto Fill ) Ġlinear Layout . addView ( btn Auto Fill ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( btn Generate ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( btn Change ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( btn Commit ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( btn Undo ) ĊĠĠĠĠĠĠĠ Ġlinear Layout . addView ( btn Delete ) ĊĊĠĠĠĠĠĠĠ Ġval Ġalert Dialog Ġ= Ġwith ( AlertDialog . Builder ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( realm . username ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( linear Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Neutral Button ( R . string . close , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠFlag Secure Helper . mark Dialog As Secure ( alert Dialog ). show () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( auto Fill ) Ġbtn Auto Fill . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuto Fill Task ( master Password . text . as CharArray , Ġrealm , Ġalert Dialog , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Generate . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGenerate Task ( master Password . text . as CharArray , Ġrealm , Ġalert Dialog , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Change . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠChange Task ( master Password . text . as CharArray , Ġrealm , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Undo . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUndo Task ( master Password . text . as CharArray , Ġrealm , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Commit . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommit Task ( master Password . text . as CharArray , Ġrealm , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbtn Delete . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( AlertDialog . Builder ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( R . string . confirm _ delete _ user _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Message ( getString ( R . string . confirm _ delete _ user _ msg , Ġrealm . username , Ġrealm . hostname )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( R . string . delete ) Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDelete Task ( master Password . text . as CharArray , Ġrealm , Ġalert Dialog , Ġfeedback Label ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Neutral Button ( R . string . keep , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate UserList ( hostname : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠUpdate UserList Task ( hostname ). execute () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠUser Proxy ( val Ġusername : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( username Ġ== Ġnull ) ĠgetString ( R . string . no _ users _ for _ host ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ"\ uD 8 3 D \ u DC 6 4 Ġ Ġ$ username " ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠEdit able . as CharArray : ĠChar Array ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠChar Array ( length ) ĊĠĠĠĠĠĠĠ Ġget Chars ( 0 , Ġlength , Ġbuf , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġbuf ĊĠĠĠ Ġ} Ċ