// ĠÂ© 2 0 1 9 - 2 0 2 0 ĠAct on ica ĠLLC Ġ- ĠAll ĠRights ĠReserved Ċ Ċ package Ġcom . act on ica . bio metrics _ vault Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . security . keystore . Key Per manently Invalid ated Exception Ċ import Ġandroid . util . Base 6 4 Ċ import Ġandroidx . annotation . NonNull Ċ import Ġandroidx . bio metric . Bio metric Prompt Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġio . flutter . embedding . engine . plugins . Flutter Plugin Ċ import Ġio . flutter . embedding . engine . plugins . Flutter Plugin . Flutter Plugin Binding Ċ import Ġio . flutter . embedding . engine . plugins . activity . Activity Aware Ċ import Ġio . flutter . embedding . engine . plugins . activity . Activity Plugin Binding Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġjava . security . Invalid Algorithm Parameter Exception Ċ import Ġjava . security . Un recover able Key Exception Ċ import Ġjavax . crypto . AE AD Bad Tag Exception Ċ Ċ /** Ċ Ġ* ĠÐķÑģÐ»Ð¸ ĠÐ½ ÐµÐ´ Ð¾ÑģÑĤ ÑĥÐ¿ Ð½Ð¾ ĠÐ¶ ÐµÐ» ÐµÐ· Ð¾ ĠÐ´Ð»Ñı ĠÐ± Ð¸ Ð¾Ð¼ ÐµÑĤ ÑĢÐ¸ Ð¸ ĠÐ¸Ð»Ð¸ ĠÐ¾ÑĤ Ð¿ ÐµÑĩ Ð°ÑĤ ÐºÐ¸ Ġ- ĠU NA VA IL ABLE Ċ Ġ* ĠÐķÑģÐ»Ð¸ ĠÑĥ Ð´Ð° Ð»Ð¸ Ð» ĠÐ¾ÑĤ Ð¿ ÐµÑĩ Ð°ÑĤ Ð¾Ðº Ġ- ĠUN RE COVER ABLE _ KEY Ċ Ġ* ĠÐķÑģÐ»Ð¸ ĠÐ´Ð¾Ð±Ð°Ð² Ð¸Ð» ĠÐ½Ð¾Ð² ÑĭÐ¹ ĠÐ¾ÑĤ Ð¿ ÐµÑĩ Ð°ÑĤ Ð¾Ðº ĠÐº ĠÑģ ÑĥÑī ÐµÑģÑĤÐ² ÑĥÑİ Ñī ÐµÐ¼ Ñĥ Ġ- ĠKEY _ PER MAN ENT LY _ INVALID ATED Ċ Ġ* ĠÐķÑģÐ»Ð¸ ĠÑĥ Ð´Ð° Ð»Ð¸ Ð» ĠPIN ĠÑģ ĠÑĤ ÐµÐ» Ðµ ÑĦ Ð¾Ð½ Ð° Ġ- ĠKEY _ PER MAN ENT LY _ INVALID ATED Ċ Ġ* Ġ*/ Ċ enum Ġclass ĠBio metrics Vault ErrorCode ( val Ġvalue : ĠString ) Ġ{ ĊĠĠĠ ĠKEY _ PER MAN ENT LY _ INVALID ATED (" Key Per manently Invalid ated "), ĊĠĠĠ ĠUN RE COVER ABLE _ KEY (" Un recover able Key "), ĊĠĠĠ ĠU NA VA IL ABLE (" Unavailable "), ĊĠĠĠ ĠUNKNOWN _ ERROR (" Error "), ĊĠĠĠ ĠC ANCE LED (" Canceled "), Ċ } Ċ Ċ // Ġhttps :// source . android . com / security / bio metric Ċ // Ġhttps :// developer . android . com / jet pack / android x / releases / bio metric Ċ // Ġhttps :// developer . android . com / training / sign - in / bio metric - auth Ċ public Ġclass ĠBio metrics Vault Plugin Ġ: ĠFlutter Plugin , ĠMethod Call Handler , ĠActivity Aware Ġ{ ĊĠĠĠ Ġprivate Ġval Ġshared Preferences Name Ġ= Ġ" Bio metrics Vault Plugin " ĊĠĠĠ Ġprivate Ġvar Ġactivity : ĠActivity ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġshared Preferences : ĠSharedPreferences ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchannel : ĠMethod Channel ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall (@ NonNull Ġcall : ĠMethod Call , Ġ@ NonNull Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call . method Ġ== Ġ" get Secret With Bio metrics ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Manager : ĠPackage Manager Ġ= Ġactivity !!. package Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! package Manager . has System Feature ( PackageManager . FEATURE _ F ING ER PRINT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UN AVAILABLE . value , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= Ġcall . argument < String >(" instructions ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcall . argument < String >(" key ") !! ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrypto Object Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Object Provider . provide Crypto Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Mode . DE CRYPT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbio metrics Auth Ġ= ĠBio metrics Auth ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġas ĠFragment Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBio metrics Auth . Completion Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( crypto Object : ĠBio metric Prompt . Crypto Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= Ġshared Preferences . getString ( key , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( secret Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdecrypted Ġ= Ġcrypto Object . cipher ?. do Final ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . decode ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecret , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBase 6 4 . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( String ( de crypted )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÐĶ Ð»Ñı ĠÑįÑĤ Ð¾Ð³Ð¾ ĠÐ¸ Ñģ ÐºÐ»ÑİÑĩ ÐµÐ½Ð¸Ñı ĠÐ²Ð¾Ð· Ð¼Ð¾Ð¶ Ð½Ð° ĠÑĤÐ°Ðº Ð°Ñı ĠÐ¿ÑĢ Ð¸Ñĩ Ð¸ Ð½Ð° Ġ- ĠÐ¿Ð¾Ð»ÑĮÐ·Ð¾Ð²Ð°ÑĤ ÐµÐ»ÑĮ ĠÑĥ Ð¶Ðµ ĠÐ¸Ð¼ Ðµ ÐµÑĤ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÐ·Ð° ÑĪÐ¸ ÑĦ ÑĢÐ¾Ð² Ð°Ð½ Ð½ÑĭÐ¹ ĠÑģ ÐµÐº ÑĢ ÐµÑĤ , ĠÐ½Ð¾ ĠÐ´Ð¾Ð±Ð°Ð² Ð¸Ð» ĠÐµ Ñī Ðµ ĠÐ± Ð¸ Ð¾Ð¼ ÐµÑĤ ÑĢÐ¸ Ñİ . ĠÐĿ Ð° ĠX ia omi ĠÐº Ð»ÑİÑĩ ĠÐ¸Ð½ Ð² Ð°Ð»Ð¸ Ð´ Ð¸ ÑĢÑĥ ÐµÑĤÑģÑı , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÐ½Ð° ĠÑį Ð¼ Ñĥ Ð»Ñı ÑĤÐ¾ÑĢ Ðµ ĠÐ½ ÐµÑĤ . ĠCrypto Object Provider ĠÑģ Ð¾Ð· Ð´Ð° ÑģÑĤ ĠÐ½Ð¾Ð² ÑĭÐ¹ ĠÐº Ð»ÑİÑĩ . ĠÐĳ ÑĥÐ´ ÐµÑĤ ĠÐ¾ÑĪÐ¸Ð± ÐºÐ° ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÑĢÐ°Ñģ ÑĪÐ¸ ÑĦ ÑĢÐ¾Ð² ÐºÐ¸ ĠÑģ ÐµÐº ÑĢ ÐµÑĤ Ð° ĠÐ½Ð¾Ð² Ñĭ Ð¼ ĠÐº Ð»ÑİÑĩ Ð¾Ð¼ . ĠÐĿ ÑĥÐ¶ Ð½Ð¾ ĠÑģÐ¾Ð¾Ð±Ñī Ð¸ÑĤÑĮ , ĠÑĩÑĤÐ¾ ĠÑĤÑĢ ÐµÐ± Ñĥ ÐµÑĤÑģÑı ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÐ¿ÐµÑĢ Ðµ ÑĪÐ¸ ÑĦ ÑĢÐ¾Ð² Ð°ÑĤÑĮ ĠÐµÐ³Ð¾ ĠÑģ ÐµÐº ÑĢ ÐµÑĤ ĠÐ½Ð¾Ð² Ñĭ Ð¼ ĠÐº Ð»ÑİÑĩ Ð¾Ð¼ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠAE AD Bad Tag Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBio metrics Vault ErrorCode . KEY _ PER MAN ENT LY _ INVALID ATED . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBio metrics Vault ErrorCode . UNKNOWN _ ERROR . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . message , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( code : ĠString ?, Ġerror : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( code , Ġerror , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbio metrics Auth . auth ( crypto Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( e , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( call . method Ġ== Ġ" set Secret With Bio metrics ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Manager : ĠPackage Manager Ġ= Ġactivity !!. package Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! package Manager . has System Feature ( PackageManager . FEATURE _ F ING ER PRINT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UN AVAILABLE . value , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstructions Ġ= Ġcall . argument < String >(" instructions ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcall . argument < String >(" key ") !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclear Ġ= Ġcall . argument < String >(" clear ") !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcrypto Object Ġ= ĠCrypto Object Provider . provide Crypto Object ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKey Mode . ENCRYPT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbio metrics Auth Ġ= ĠBio metrics Auth ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity Ġas ĠFragment Activity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠBio metrics Auth . Completion Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( crypto Object : ĠBio metric Prompt . Crypto Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencrypted Ġ= Ġcrypto Object . cipher ?. do Final ( clear . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Ġ= ĠBase 6 4 . encode ToString ( encrypted !! , ĠBase 6 4 . DEFAULT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeditor Ġ= Ġshared Preferences . edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . putString ( key , Ġsecret ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . apply () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success (" Success ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( code : ĠString ?, Ġerror : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( code , Ġerror , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstructions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbio metrics Auth . auth ( crypto Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( error , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( call . method Ġ== Ġ" delete Secret With Bio metrics ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Manager : ĠPackage Manager Ġ= Ġactivity !!. package Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! package Manager . has System Feature ( PackageManager . FEATURE _ F ING ER PRINT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UN AVAILABLE . value , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġcall . argument < String >(" key ") !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCrypto Object Provider . delete SecretKey ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . success (" Success ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Error ( error , Ġresult ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . not Implemented () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Error ( error : ĠThrowable , Ġresult : ĠResult ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInvalid Algorithm Parameter Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UN AVAILABLE . value , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUn recover able Key Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UN RE COVER ABLE _ KEY . value , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKey Per manently Invalid ated Exception Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBio metrics Vault ErrorCode . KEY _ PER MAN ENT LY _ INVALID ATED . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . error ( Bio metrics Vault ErrorCode . UNKNOWN _ ERROR . value , Ġerror . toString (), Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Engine ( binding : ĠFlutter Plugin Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchannel Ġ= ĠMethod Channel ( binding . flutter Engine . dart Executor , Ġ" com . act on ica . bio metrics _ vault ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Engine ( binding : ĠFlutter Plugin Binding ) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Activity ( binding : ĠActivity Plugin Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġ= Ġbinding . activity ĊĠĠĠĠĠĠĠ Ġshared Preferences Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity !!. get SharedPreferences ( shared Preferences Name , ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Activity For Config Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Re attached To Activity For Config Changes ( binding : ĠActivity Plugin Binding ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġ= Ġbinding . activity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Detached From Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġactivity Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( null ) ĊĠĠĠ Ġ} Ċ } Ċ