/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . android . system ui . controls . ui Ċ Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . content . DialogInterface Ċ import Ġandroid . service . controls . actions .* Ċ import Ġandroid . text . InputType Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . CheckBox Ċ import Ġandroid . widget . EditText Ċ import Ġcom . android . system ui . controls . R Ċ Ċ /** Ċ Ġ* ĠCreates Ġall Ġdialog s Ġfor Ġchallenge Values Ġthat Ġcan Ġoccur Ġfrom Ġa Ġcall Ġto Ċ Ġ* Ġ[ Controls Provider Service # perform Control Action ]. ĠThe Ġtypes Ġof Ġchallenge Ġresponses Ġare Ġlisted Ġin Ċ Ġ* Ġ[ Control Action . Response Result ]. Ċ Ġ*/ Ċ object ĠChallenge Dialog s Ġ{ ĊĊĠĠĠ Ġ// private Ġconst Ġval ĠWINDO W _ TYPE Ġ= ĠWindow Manager . LayoutParams . TYPE _ VOLUME _ OVER LAY ĊĠĠĠ Ġprivate Ġconst Ġval ĠSTYLE Ġ= Ġandroid . R . style . Theme _ Device Default _ Dialog _ Alert ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAlertDialog s Ġto Ġhandle Ġ[ Control Action # RESPONSE _ CH ALL EN GE _ PIN ] Ġand ĊĠĠĠĠ Ġ* Ġ[ Control Action # RESPONSE _ CH ALL EN GE _ PIN ] Ġresponses , Ġdecided Ġby Ġthe Ġuse Alpha Numeric ĊĠĠĠĠ Ġ* Ġparameter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Pin Dialog ( ĊĠĠĠĠĠĠĠ Ġcv h : ĠControl ViewHolder , ĊĠĠĠĠĠĠĠ Ġuse Alpha Numeric : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġuse Retry Strings : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġon Cancel : Ġ() Ġ-> ĠUnit ĊĠĠĠ Ġ): ĠDialog ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Action Ġ= Ġcv h . last Action ĊĠĠĠĠĠĠĠ Ġif Ġ( last Action Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Controls Ui Controller . TAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PIN ĠDialog Ġattempted Ġbut Ġno Ġlast Ġaction Ġis Ġset . ĠWill Ġnot Ġshow ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġcv h . context . resources ĊĠĠĠĠĠĠĠ Ġval Ġ( title , Ġinstructions ) Ġ= Ġif Ġ( use Retry Strings ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . getString ( R . string . controls _ pin _ wrong ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . controls _ pin _ instructions _ retry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres . getString ( R . string . controls _ pin _ verify , Ġcv h . title . getText ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . controls _ pin _ instructions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( cv h . context , ĠSTYLE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset View ( R . layout . controls _ dialog _ pin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . string . ok , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dialog Ġis ĠDialog ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . require ViewById < EditText >( R . id . controls _ pin _ input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpin Ġ= Ġdialog . require ViewById < EditText >( R . id . controls _ pin _ input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getText (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcv h . action ( add Challenge Value ( last Action , Ġpin )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Negative Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . string . cancel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// setType ( WINDOW _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Soft Input Mode ( WindowManager . LayoutParams . SOFT _ INPUT _ STATE _ VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Show Listener ( DialogInterface . On Show Listener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġedit Text Ġ= Ġrequire ViewById < EditText >( R . id . controls _ pin _ input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . set Hint ( instructions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuse Alpha CheckBox Ġ= Ġrequire ViewById < CheckBox >( R . id . controls _ pin _ use _ alpha ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Alpha CheckBox . setChecked ( use Alpha Numeric ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset InputType ( edit Text , Ġuse Alpha CheckBox . isChecked ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ViewById < CheckBox >( R . id . controls _ pin _ use _ alpha ). setOnClickListener Ġ{ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset InputType ( edit Text , Ġuse Alpha CheckBox . isChecked ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . request Focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAlertDialog s Ġto Ġhandle Ġ[ Control Action # RESPONSE _ CH ALL EN GE _ ACK ] Ġresponse Ġtype . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate Confirmation Dialog ( cv h : ĠControl ViewHolder , Ġon Cancel : Ġ() Ġ-> ĠUnit ): ĠDialog ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Action Ġ= Ġcv h . last Action ĊĠĠĠĠĠĠĠ Ġif Ġ( last Action Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( Controls Ui Controller . TAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Confirmation ĠDialog Ġattempted Ġbut Ġno Ġlast Ġaction Ġis Ġset . ĠWill Ġnot Ġshow ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠAlertDialog . Builder ( cv h . context , ĠSTYLE ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġcv h . context . resources ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetTitle ( res . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . string . controls _ confirmation _ message , Ġcv h . title . getText ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . string . ok , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcv h . action ( add Challenge Value ( last Action , Ġ" true ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . dismiss () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Negative Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . string . cancel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDialog Interface . OnClickListener Ġ{ Ġdialog , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Cancel . invoke () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . create (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// setType ( WINDOW _ TYPE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset InputType ( edit Text : ĠEditText , Ġuse TextInput : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( use TextInput ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . set InputType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ TEXT Ġor ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedit Text . set InputType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ NUMBER Ġor ĠInput Type . TYPE _ NUMBER _ VARI ATION _ PASSWORD ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Challenge Value ( action : ĠControl Action , Ġchallenge Value : ĠString ): ĠControl Action Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġaction . get Template Id () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠBoolean Action Ġ-> ĠBoolean Action ( id , Ġaction . getNew State (), Ġchallenge Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFloat Action Ġ-> ĠFloat Action ( id , Ġaction . get NewValue (), Ġchallenge Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCommand Action Ġ-> ĠCommand Action ( id , Ġchallenge Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠMode Action Ġ-> ĠMode Action ( id , Ġaction . getNew Mode (), Ġchallenge Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException ("' action ' Ġis Ġnot Ġa Ġknown Ġtype : Ġ$ action ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ