@ file : Suppress (" DE PREC ATION ", Ġ" Magic Number ") Ċ package Ġcom . uport . sdk . signer . encryption Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . hardware . fingerprint . Fingerprint Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Cancellation Signal Ċ import Ġandroidx . fragment . app . Dialog Fragment Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . De cel erate Interpolator Ċ import Ġandroid . view . animation . Over shoot Interpolator Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġcom . uport . sdk . signer . R Ċ Ċ @ Target Api ( Build . VERSION _ CODES . M ) Ċ class ĠF ingerprint Dialog Ġ: ĠDialog Fragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfingerprint Manager : ĠF ingerprint Manager ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcancellation Signal : ĠC ancellation Signal ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcrypto Object : ĠF ingerprint Manager . Crypto Object ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcallbacks : ĠF ingerprint Dialog Callbacks ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpurpose : ĠString ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpurpose TextView : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠimageView Status : ĠImageView ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠtextView Status : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcancel Button : ĠView ĊĊĠĠĠ Ġprivate Ġvar Ġsuccess Color : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġfailure Color : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġretain Instance Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġpurpose Ġ= ĠsavedInstanceState ?. getString ( KEY _ DIALOG _ P URPOSE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġarguments ?. getString ( KEY _ DIALOG _ P URPOSE ) Ġ?: Ġ"" ĊĊĠĠĠĠĠĠĠ Ġfingerprint Manager Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ?. getSystem Service ( Context . F ING ER PRINT _ SERVICE ) Ġas ĠF ingerprint Manager ĊĠĠĠĠĠĠĠ Ġsuccess Color Ġ= Ġcontext ?. getColor ( R . color . uport _ fingerprint _ green ) Ġ?: ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġfailure Color Ġ= Ġcontext ?. getColor ( R . color . uport _ fingerprint _ red ) Ġ?: ĠColor . RED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġ// ĠReset Ġthe Ġcancellation Ġsignal Ġwhich Ġis Ġused Ġto Ġcancel Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġfingerprint Ġauthentication Ġprocess . ĊĠĠĠĠĠĠĠ Ġcancellation Signal Ġ= ĠC ancellation Signal () ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġa Ġvalid ĠCrypto Object Ġhas Ġbeen Ġprovided ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStart Ġlistening Ġfor Ġfingerprint Ġevents ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfingerprint Manager . authenticate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcrypto Object , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcancellation Signal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Callbacks (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠShould Ġnever Ġbe Ġthrown Ġsince Ġwe Ġhave Ġdeclared Ġthe ĠUSE _ F ING ER PRINT Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthe Ġmanifest ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnop ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSecurity Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnop ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġfingerprint Ġauthentication Ġprocess Ġis Ġrunning , Ġcancel Ġit . ĊĠĠĠĠĠĠĠ Ġcancellation Signal . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġinflater . inflate ( R . layout . fragment _ fingerprint , Ġcontainer ) ĊĊĠĠĠĠĠĠĠ Ġpurpose TextView Ġ= Ġcontent . findViewById ( R . id . purpose ) ĊĠĠĠĠĠĠĠ Ġpurpose TextView . text Ġ= Ġpurpose ĊĠĠĠĠĠĠĠ ĠimageView Status Ġ= Ġcontent . findViewById ( R . id . imageView Fingerprint Status ) ĊĠĠĠĠĠĠĠ ĠtextView Status Ġ= Ġcontent . findViewById ( R . id . textView Fingerprint Status ) ĊĠĠĠĠĠĠĠ Ġcancel Button Ġ= Ġcontent . findViewById ( R . id . button Fingerprint Cancel ) ĊĊĠĠĠĠĠĠĠ Ġcancel Button . setOnClickListener Ġ{ Ġon Cancel Pressed () Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontent ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride ĊĠĠĠ Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= Ġdialog ĊĠĠĠĠĠĠĠ Ġ// Ġhandles Ġhttps :// code . google . com / p / android / issues / detail ? id = 1 7 4 2 3 ĊĠĠĠĠĠĠĠ Ġif Ġ( dialog Ġ!= Ġnull Ġ&& Ġretain Instance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . set Dismiss Message ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Cancel Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġcallbacks . on Fingerprint Cancel () ĊĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShould Ġbe Ġcalled Ġbefore Ġthe Ġdialog Ġis Ġshown Ġin Ġorder Ġto Ġprovide Ġa Ġvalid ĠCrypto Object . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcrypto Object ĠThe Ġ[ Fingerprint Manager . Crypto Object ] Ġwe Ġwant Ġto Ġauthenticate Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġcallbacks Ġan Ġimplementation Ġof Ġthe Ġ[ Fingerprint Dialog Callbacks ] Ġinterface ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġinit ( crypto Object : ĠF ingerprint Manager . Crypto Object , Ġcallbacks : ĠF ingerprint Dialog Callbacks ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . crypto Object Ġ= Ġcrypto Object ĊĠĠĠĠĠĠĠ Ġthis . callbacks Ġ= Ġcallbacks ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġstatus Ġtext Ġin Ġthe Ġdialog Ġwith Ġthe Ġprovided Ġerror Ġmessage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtext Ġrepresents Ġthe Ġerror Ġmessage Ġwhich Ġwill Ġbe Ġshown ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Error Text ( text : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠ ĠimageView Status . setImage Resource ( R . drawable . uport _ ic _ fingerprint _ error ) ĊĠĠĠĠĠĠĠ ĠtextView Status . text Ġ= Ġtext ĊĠĠĠĠĠĠĠ ĠtextView Status . setTextColor ( failure Color ) ĊĊĠĠĠĠĠĠĠ ĠimageView Status . animate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotation By ( 9 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Interpolator ( Over shoot Interpolator ( 1 . 4 f )). duration Ġ= ĠAN IM ATION _ DURATION . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdates Ġthe Ġstatus Ġtext Ġin Ġthe Ġdialog Ġwith Ġa Ġsuccess Ġtext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Success Text () Ġ{ ĊĠĠĠĠĠĠĠ ĠimageView Status . setImage Resource ( R . drawable . uport _ ic _ fingerprint _ done ) ĊĠĠĠĠĠĠĠ ĠtextView Status . text Ġ= ĠgetString ( R . string . uport _ fingerprint _ success ) ĊĠĠĠĠĠĠĠ ĠtextView Status . setTextColor ( success Color ) ĊĊĠĠĠĠĠĠĠ ĠimageView Status . rotation Ġ= Ġ 6 0 f ĊĠĠĠĠĠĠĠ ĠimageView Status . animate () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. rotation ( 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Interpolator ( De cel erate Interpolator ( 1 . 4 f )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( ANIM ATION _ DURATION . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Listener ( object Ġ: ĠAn imator . Animator Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Start ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġthe Ġanimation Ġto Ġfinish , Ġthen Ġdismiss Ġthe Ġdialog Ġand ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinvoke Ġthe Ġcallback Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallbacks . on Fingerprint Success ( crypto Object ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Repeat ( animation : ĠAn imator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEmpty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġinterface Ġwhich Ġthe Ġcaller Ġmust Ġimplement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠF ingerprint Dialog Callbacks Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Fingerprint Success ( crypto Object : ĠF ingerprint Manager . Crypto Object ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Fingerprint Cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġclass Ġrepresents Ġthe Ġcallbacks Ġinvoked Ġby Ġthe ĠF ingerprint Manager Ġclass . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinner Ġclass ĠAuth Callbacks Ġ: ĠF ingerprint Manager . Authentication Callback () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Failed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Failed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Text (" Authentication Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Error ( errorCode : ĠInt , Ġerr String : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Error ( errorCode , Ġerr String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġif Ġ" too Ġmany Ġattempts Ġerror Ġoccurs , Ġask Ġfor Ġdevice Ġunlock " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Text ( err String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Help ( help Code : ĠInt , Ġhelp String : ĠCharSequence ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Help ( help Code , Ġhelp String ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Text ( help String ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Authentication Succeeded ( result : ĠF ingerprint Manager . Authentication Result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Authentication Succeeded ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Success Text () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAN IM ATION _ DURATION Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠKEY _ DIALOG _ P URPOSE Ġ= Ġ" key _ purpose " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTAG _ F ING ER PRINT _ DIALOG : ĠString Ġ= Ġ" fingerprint _ dialog " ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate ( purpose : ĠString ): ĠF ingerprint Dialog Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠF ingerprint Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbundle . putString ( KEY _ DIALOG _ P URPOSE , Ġpurpose ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . arguments Ġ= Ġbundle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdialog ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ