package Ġcom . mobile health sport s . v accine pass . ui . pin čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . content . Intent č Ċ import Ġandroid . os . Bundle č Ċ import Ġandroidx . databinding . Data Binding Util č Ċ import Ġandroidx . security . crypto . Encrypted SharedPreferences č Ċ import Ġandroidx . security . crypto . Master Key č Ċ import Ġcom . mobile health sport s . v accine pass . R č Ċ import Ġcom . mobile health sport s . v accine pass . databinding . Activity Pin Binding č Ċ import Ġcom . mobile health sport s . v accine pass . presentation . services . messages . Message Service č Ċ import Ġcom . mobile health sport s . v accine pass . presentation . services . navigation . Navigation Service č Ċ import Ġcom . mobile health sport s . v accine pass . util . Base Activity č Ċ import Ġio . reactivex . rx java 3 . dis pos ables . Composite Disposable č Ċ import Ġorg . k oin . android . ext . android . inject č Ċ import Ġorg . k oin . android x . view model . ext . android . state ViewModel č Ċ import Ġorg . k oin . core . parameter . parameters Of čĊč Ċ class ĠPin Activity Ġ: ĠBase Activity () Ġ{ čĊĠĠĠ Ġprivate Ġvar Ġdis pos ables Ġ= ĠComposite Disposable () čĊĠĠĠ Ġprivate Ġval Ġmessage Service : ĠMessage Service Ġby Ġinject Ġ{ Ġparameters Of ( this ) Ġ} čĊĠĠĠ Ġprivate Ġval Ġnavigation Service : ĠNavigation Service Ġby Ġinject Ġ{ Ġparameters Of ( this ) Ġ} čĊĠĠĠ Ġprivate Ġval ĠviewModel : ĠPin ViewModel Ġby Ġstate ViewModel () čĊĠĠĠ Ġprivate Ġval Ġpin List : ĠMutable List < Boolean > Ġ= Ġmutable ListOf () čĊĠĠĠ Ġprivate Ġval Ġpin List Line : ĠMutable List < Int > Ġ= Ġmutable ListOf () čĊĠĠĠ Ġprivate Ġval Ġadapter Ġ= ĠPin View Adapter ( pin List ) čĊĠĠĠ Ġprivate Ġval Ġadapter Line Ġ= ĠPin Line View Adapter ( pin List Line ) čĊĠĠĠ Ġprivate Ġvar Ġlast Pin Count Ġ= Ġ 0 čĊčĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġbinding : ĠActivity Pin Binding Ġ= ĠData Binding Util . set ContentView ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . layout . activity _ pin čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ Ġbinding . viewModel Ġ= ĠviewModel čĊĠĠĠĠĠĠĠ Ġbinding . pin Recycler view . adapter Ġ= Ġadapter čĊĠĠĠĠĠĠĠ Ġbinding . line Recycler view . adapter Ġ= Ġadapter Line čĊĠĠĠĠĠĠĠ Ġbinding . lifecycle Owner Ġ= Ġthis čĊčĊĠĠĠĠĠĠĠ Ġmessage Service . subscribe To Requests ( viewModel . message Request ) čĊĠĠĠĠĠĠĠ Ġnavigation Service . subscribe To Requests ( viewModel . navigation Request ) čĊĠĠĠĠĠĠĠ Ġdis pos ables . addAll ( message Service , Ġnavigation Service ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġmaster Key Ġ= ĠMaster Key . Builder ( this , ĠMaster Key . DEFAULT _ MASTER _ KEY _ ALIAS ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Key Scheme ( Master Key . Key Scheme . AES 2 5 6 _ GCM ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () čĊčĊĠĠĠĠĠĠĠ Ġval Ġshared Preferences Ġ= ĠEn crypted SharedPreferences . create ( čĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" V accine Pass ", čĊĠĠĠĠĠĠĠĠĠĠĠ Ġmaster Key , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Key Encryption Scheme . AES 2 5 6 _ SI V , čĊĠĠĠĠĠĠĠĠĠĠĠ ĠEn crypted SharedPreferences . Pref Value Encryption Scheme . AES 2 5 6 _ GCM čĊĠĠĠĠĠĠĠ Ġ) čĊĠĠĠĠĠĠĠ ĠviewModel . shared Preferences Ġ= Ġshared Preferences čĊčĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġstate Ġ= Ġintent . get Serializable Extra ( EXTRA _ STATE )) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPin ViewModel . Pin State Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setInitial State ( state ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġintent . getInt Extra ( EXTRA _ PIN _ LENGTH , Ġ 4 ) čĊĠĠĠĠĠĠĠ ĠviewModel . set Pin Length ( length ) čĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġ( 1 .. length ) čĊĠĠĠĠĠĠĠ Ġpin List Line . addAll ( list ) čĊĠĠĠĠĠĠĠ Ġlist . forEach Ġ{ Ġ_ Ġ-> čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpin List . add ( false ) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġadapter Line . notify DataSet Changed () čĊčĊĠĠĠĠĠĠĠ ĠviewModel . pin Count . observe ( this , Ġ{ Ġpin Count Ġ-> čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pin Count Ġ> Ġpin List . count ()) Ġreturn @ observe čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġpin Count Ġis Ġ 0 Ġall Ġpins Ġshould Ġbe Ġset Ġinvisible čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pin Count Ġ== Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin List . replaceAll Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pin Count Ġ= Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ observe čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġeither Ġthe Ġremoved Ġpin Ġinvisible Ġor Ġthe Ġcurrent Ġpin Ġvisible čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcounting Ġstarts Ġat Ġ 0 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Pin Count Ġ> Ġpin Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin List [ pin Count ] Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpin List [ pin Count Ġ- Ġ 1 ] Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// adapter . pins Ġ= Ġpin List čĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . notify DataSet Changed () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Pin Count Ġ= Ġpin Count čĊĠĠĠĠĠĠĠ Ġ}) čĊčĊĠĠĠĠĠĠĠ ĠviewModel . correct Pin . observe ( this , Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠIntent (). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Extra (" result ", Ġtrue ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Result ( RESULT _ OK , Ġdata ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ}) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ čĊĠĠĠĠĠĠĠ Ġdis pos ables . dispose () čĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ STATE Ġ= Ġ" Pin State " čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠEX TRA _ PIN _ LENGTH Ġ= Ġ" Pin Length " čĊčĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġintent Ġto Ġnavigate Ġto Ġthis Ġclass čĊĠĠĠĠĠĠĠ Ġfun Ġintent ( context : ĠContext , Ġstate : ĠPin ViewModel . Pin State , Ġpin Length : ĠInt ): ĠIntent Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIntent ( context , ĠPin Activity :: class . java ). apply Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . putExtra ( EXTRA _ STATE , Ġstate ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . putExtra ( EXTRA _ PIN _ LENGTH , Ġpin Length ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} č Ċ }