/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠAC IN Q ĠSAS Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġfr . ac in q . phoenix . security Ċ Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Handler Ċ import Ġandroid . text . Editable Ċ import Ġandroid . text . Text Watcher Ċ import Ġandroid . view . H aptic Feedback Constants Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . widget . Button Ċ import Ġandroidx . databinding . Data Binding Util Ċ import Ġcom . google . common . base . Strings Ċ import Ġfr . ac in q . phoenix . R Ċ import Ġfr . ac in q . phoenix . databinding . Dialog Pin Binding Ċ import Ġfr . ac in q . phoenix . utils . Converter Ċ import Ġfr . ac in q . phoenix . utils . Prefs Ċ Ċ class ĠPin Dialog Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġtheme Res Id : ĠInt , Ġprivate Ġval Ġpin Callback : ĠPin Dialog Callback , ĊĠ Ġtitle Res Id : ĠInt Ġ= ĠR . string . p ind ialog _ title _ default , Ġcancel able : ĠBoolean Ġ= Ġtrue ) Ġ: ĠDialog ( context , Ġtheme Res Id ) Ġ{ ĊĊĠ Ġprivate Ġval Ġm Binding : ĠDialog Pin Binding Ġ= ĠData Binding Util . inflate ( LayoutInflater . from ( getContext ()), ĠR . layout . dialog _ pin , Ġnull , Ġfalse ) ĊĠ Ġprivate Ġvar Ġm Pin Value : ĠString Ġ= Ġ"" ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠsetContentView ( m Binding . root ) ĊĠĠĠ Ġset On Cancel Listener Ġ{ Ġpin Callback . on Pin Cancel ( this @ Pin Dialog ) Ġ} ĊĠĠĠ Ġm Binding . pin Title . text Ġ= ĠConverter . html ( getContext (). getString ( title Res Id )) ĊĠĠĠ Ġset Cancel able ( cancel able ) ĊĊĠĠĠ Ġ// Ġrandomly Ġsorted Ġpin Ġbuttons ĊĠĠĠ Ġval Ġpin Buttons Ġ= ĠlistOf ( ĊĠĠĠĠĠ Ġm Binding . pin Num 0 , ĊĠĠĠĠĠ Ġm Binding . pin Num 1 , ĊĠĠĠĠĠ Ġm Binding . pin Num 2 , ĊĠĠĠĠĠ Ġm Binding . pin Num 3 , ĊĠĠĠĠĠ Ġm Binding . pin Num 4 , ĊĠĠĠĠĠ Ġm Binding . pin Num 5 , ĊĠĠĠĠĠ Ġm Binding . pin Num 6 , ĊĠĠĠĠĠ Ġm Binding . pin Num 7 , ĊĠĠĠĠĠ Ġm Binding . pin Num 8 , ĊĠĠĠĠĠ Ġm Binding . pin Num 9 ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġfor Ġ( v Ġin Ġpin Buttons ) Ġ{ ĊĠĠĠĠĠ Ġv . setOnClickListener Ġ{ Ġview Ġ-> ĊĠĠĠĠĠĠĠ Ġview . is H aptic Feedback Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġview . perform H aptic Feedback ( H aptic Feedback Constants . VIRTUAL _ KEY , ĠH aptic Feedback Constants . FLAG _ IGNORE _ GLOBAL _ SETTING ) ĊĠĠĠĠĠĠĠ Ġif Ġ( m Pin Value Ġ== Ġ"" Ġ|| Ġm Pin Value . length Ġ!= ĠPIN _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġdigit Ġ= Ġ( view Ġas ĠButton ). text . toString () ĊĠĠĠĠĠĠĠĠĠ Ġm Pin Value Ġ+= Ġdigit ĊĠĠĠĠĠĠĠĠĠ Ġm Binding . pin Display . text Ġ= ĠStrings . repeat ( PIN _ PLACE HOLDER , Ġm Pin Value . length ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( Prefs . is Pin Scr amb led ( context )) Ġ{ ĊĠĠĠĠĠ Ġm Binding . pin Grid . removeAll Views () ĊĠĠĠĠĠ Ġpin Buttons . sh uffled (). with Index (). forEach Ġ{ Ġindexed Btn Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( indexed Btn . index Ġ== Ġpin Buttons . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġm Binding . pin Grid . addView ( m Binding . pin Num Clear ) ĊĠĠĠĠĠĠĠĠĠ Ġm Binding . pin Grid . addView ( indexed Btn . value ) ĊĠĠĠĠĠĠĠĠĠ Ġm Binding . pin Grid . addView ( m Binding . pin Back space ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġm Binding . pin Grid . addView ( indexed Btn . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Binding . pin Display . add TextChanged Listener ( object Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence ?, Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( s Ġ!= Ġnull Ġ&& Ġs . length Ġ== ĠPIN _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġautomatically Ġconfirm Ġpin Ġwhen Ġpin Ġis Ġlong Ġenough ĊĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ġpin Callback . on Pin Confirm ( this @ Pin Dialog , Ġm Pin Value ) Ġ}, Ġ 3 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( s : ĠEdit able ) Ġ{} ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġm Binding . pin Num Clear . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġm Pin Value Ġ= Ġ"" ĊĠĠĠĠĠ Ġm Binding . pin Display . text Ġ= Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġm Binding . pin Back space . setOnClickListener Ġ{ ĊĠĠĠĠĠ Ġif Ġ( m Pin Value . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Pin Value Ġ= Ġm Pin Value . substring ( 0 , Ġm Pin Value . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġm Binding . pin Display . text Ġ= ĠStrings . repeat ( PIN _ PLACE HOLDER , Ġm Pin Value . length ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġreset () Ġ{ ĊĠĠĠ Ġm Pin Value Ġ= Ġ"" ĊĠĠĠ Ġm Binding . pin Display . text Ġ= Ġ"" ĊĠ Ġ} ĊĊĠ Ġfun Ġanimate Success () Ġ{ ĊĠĠĠ Ġthis . dismiss () ĊĠ Ġ} ĊĊĠ Ġfun Ġanimate Failure () Ġ{ ĊĠĠĠ Ġthis . dismiss () ĊĠ Ġ} ĊĊĠ Ġinterface ĠPin Dialog Callback Ġ{ ĊĠĠĠ Ġfun Ġon Pin Confirm ( dialog : ĠPin Dialog , Ġpin Code : ĠString ) ĊĊĠĠĠ Ġfun Ġon Pin Cancel ( dialog : ĠPin Dialog ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠPIN _ PLACE HOLDER Ġ= Ġ"\ u 2 5 CF " ĊĠĠĠ Ġprivate Ġconst Ġval ĠPIN _ LENGTH Ġ= Ġ 6 ĊĠ Ġ} Ċ } Ċ