package Ġcom . vio let . verify input lib Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Keep Ċ import Ġandroidx . appcompat . app . AppCompat Dialog Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . util . regex . Pattern Ċ Ċ /** Ċ Ġ* Ġåıª æĶ¯æĮģ Ġ åŃĹæ®µ ä¸º String / TextView / EditText ä»¥åıĬ åŃĲ ç±» ãĢĤ Ċ Ġ*/ Ċ @ Keep Ċ @ Retention ( Annotation Retention . RUNTIME ) Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠVerify Input ( ĊĠĠĠ Ġval Ġerror : ĠString Ġ= Ġ"", ĊĠĠĠ Ġval ĠmaxLength : ĠInt Ġ= Ġ- 1 , ĊĠĠĠ Ġval Ġmin Length : ĠInt Ġ= Ġ- 1 , ĊĠĠĠ Ġval Ġindex : ĠInt Ġ= Ġ 1 , ĊĠĠĠ Ġval Ġshow Toast : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġ@ Verify InputType Ġval Ġtype : ĠInt Ġ= ĠVerify InputType . TYPE _ EMPTY Ċ ) Ċ Ċ @ Keep Ċ @ Target ( Annotation Target . VALUE _ PARAMETER ) Ċ annotation Ġclass ĠVerify InputType Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ éĿŀ ç©º åĪ¤æĸŃ åĮħæĭ¬ ç©º åŃĹç¬¦ä¸² ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ EMPTY Ġ= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ éĤ®ç®± åĪ¤æĸŃ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ EMAIL Ġ= Ġ 2 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġä¸Ń åĽ½ æīĭæľº åı· æł¡éªĮ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ PHONE _ CN Ġ= Ġ 3 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġä¸Ń åĽ½ èº«ä»½ è¯ģ åı· æł¡éªĮ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ ID _ CN Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ çº ¯ ä¸Ńæĸĩ æł¡éªĮ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ CN Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ çº ¯ èĭ± æĸĩ æł¡éªĮ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ EN Ġ= Ġ 6 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġ çº ¯ æķ°åŃĹ æł¡éªĮ ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠTYPE _ NUMBER Ġ= Ġ 7 ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠView . verify (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify ( this . context . application Context , Ġthis ) Ċ } Ċ Ċ fun ĠAppCompat Dialog . verify (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify ( this . context . application Context , Ġthis ) Ċ } Ċ Ċ fun ĠActivity . verify (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify ( this . application Context , Ġthis ) Ċ } Ċ Ċ fun ĠFragment . verify (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify ( require Context (). application Context , Ġthis ) Ċ } Ċ Ċ private Ġfun Ġsort List ( fields : ĠArray < Field >? ): ĠMutable List < Field >? Ġ{ ĊĠĠĠ Ġif ( fields . isNull OrEmpty ()) Ġreturn Ġnull ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Field >() ĊĠĠĠ Ġfor ( field Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! field . is Annotation Present ( Verify Input :: class . java )) Ġcontinue ĊĠĠĠĠĠĠĠ Ġlist . add ( field ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlist . sortBy Ġ{ ĊĠĠĠĠĠĠĠ Ġit . getAnnotation ( Verify Input :: class . java ). index ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist Ċ } Ċ Ċ fun Ġverify ( context : ĠContext , Ġany : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġfields Ġ= Ġany . java Class . declared Fields ĊĠĠĠ Ġif Ġ( fields . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠ Ġval Ġfield List Ġ= Ġsort List ( fields ) ĊĠĠĠ Ġif ( field List . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠ Ġfor Ġ( field Ġin Ġfield List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif (! field . is Annotation Present ( Verify Input :: class . java )) Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġann Ġ= Ġfield . getAnnotation ( Verify Input :: class . java ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġval Ġobj Ġ= Ġfield . get ( any ) ĊĠĠĠĠĠĠĠ Ġif ( obj Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" åĨħå®¹ ä¸įèĥ½ä¸ºç©º ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! isString Field ( obj ) Ġ&& Ġ! is TextView Field ( obj )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ("${ field . name } Ġmust Ġbe ĠString Ġor ĠTextView ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( ann . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ EMPTY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ann . maxLength Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠgetString ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str . length Ġ> Ġann . maxLength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! ann . show Toast ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" éķ¿åº¦ ä¸įèĥ½ è¶ħè¿ĩ Ġ${ ann . maxLength }", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ann . min Length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= ĠgetString ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( str . length Ġ< Ġann . min Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif (! ann . show Toast ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( context , Ġ" éķ¿åº¦ ä¸įèĥ½ å°ĳ äºİ Ġ${ ann . min Length }", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ PHONE _ CN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ" æīĭæľº åı· ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġphone Ġ= ĠgetString ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Phone CN ( phone )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ ID _ CN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ" èº«ä»½ è¯ģ åı· çłģ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠgetString ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is ID Number ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" èº«ä»½ è¯ģ åı· çłģ æł¼å¼ı ä¸į æŃ£ç¡® ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ EMAIL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ" éĤ®ç®± ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠgetString ( obj ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Email ( id )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" éĤ®ç®± æł¼å¼ı ä¸į æŃ£ç¡® ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ CN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , "" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcn Ġ= ĠgetString ( obj ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify CN ( cn )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" ä¸Ńæĸĩ æł¼å¼ı ä¸į æŃ£ç¡® ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ NUMBER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠgetString ( obj ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Number ( number )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" æķ°åŃĹ æł¼å¼ı ä¸į æŃ£ç¡® ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠVerify InputType . TYPE _ EN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify Null ( context , Ġann , Ġobj , Ġ"")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġen Ġ= ĠgetString ( obj ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! verify EN ( en )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ" èĭ± æĸĩ æł¼å¼ı ä¸į æŃ£ç¡® ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġfun Ġget Toast Msg ( ann : ĠVerify Input , Ġtoast Msg : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġif ( ann . error . isEmpty ()) Ġtoast Msg Ġelse Ġann . error Ċ } Ċ Ċ private Ġfun Ġtoast ( context : ĠContext , Ġann : ĠVerify Input , Ġtoast Msg : ĠString ){ ĊĠĠĠ Ġif (! ann . show Toast ) Ġreturn ĊĠĠĠ ĠToast . makeText ( context , Ġget Toast Msg ( ann , Ġtoast Msg ), ĠToast . LENGTH _ SHORT ). show () Ċ } Ċ Ċ private Ġfun ĠgetString ( obj : ĠAny ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen ( obj ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġobj ĊĠĠĠĠĠĠĠ Ġis ĠTextView Ġ-> Ġobj . text . toString (). trim () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġverify Regex ( content : ĠString , Ġregex : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġcompile Ġ= ĠPattern . compile ( regex ) ĊĠĠĠ Ġval Ġmatcher Ġ= Ġcompile . matcher ( content ) ĊĠĠĠ Ġreturn Ġmatcher . matches () Ċ } Ċ Ċ fun Ġverify EN ( content : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify Regex ( content , Ġ"[ a - zA - Z ]+ ") Ċ } Ċ Ċ fun Ġverify Number ( content : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify Regex ( content , Ġ"[ 0 - 9 ]{ 1 , }") Ċ } Ċ Ċ fun Ġverify CN ( content : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify Regex ( content , Ġ"[ \ u 4 e 0 0 -\ u 9 fa 5 ]+ ") Ċ } Ċ Ċ fun Ġverify Email ( email : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify Regex ( email , Ġ"^ \\ s * \\ w +( ?: \\. ?[ \\ w - ]+ )* @ [ a - zA - Z 0 - 9 ]+ (?: [- . ][ a - zA - Z 0 - 9 ]+ )* \\ .[ a - zA - Z ]+ \\ s *$ ") Ċ } Ċ Ċ fun Ġverify Phone CN ( phone : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġverify Regex ( phone , Ġ"^ ( 1 2 | 1 3 | 1 4 | 1 5 | 1 6 | 1 7 | 1 8 | 1 9 )\\ d { 9 }$ ") Ċ } Ċ Ċ private Ġfun Ġverify Null ( context : ĠContext , Ġann : ĠVerify Input , Ġobj : ĠAny , Ġtype : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġif ( isString Field ( obj )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġobj Ġas ĠString ĊĠĠĠĠĠĠĠ Ġif ( str . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ"${ type } åĨħå®¹ ä¸įèĥ½ä¸ºç©º ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( is TextView Field ( obj )){ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġobj Ġas ĠTextView ĊĠĠĠĠĠĠĠ Ġif ( text . text . toString (). trim (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoast ( context , Ġann , Ġ"${ type } åĨħå®¹ ä¸įèĥ½ä¸ºç©º ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ /** Ċ Ġ* Ġ çľģ ä»½ è¯ģ id æŃ£ åĪĻ æł¡éªĮ Ċ Ġ*/ Ċ private Ġfun Ġis ID Number ( ID Number : ĠString ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// Ġ å®ļä¹ī åĪ¤ åĪ« çĶ¨æĪ· èº«ä»½ è¯ģ åı· çļĦ æŃ£ åĪĻ è¡¨è¾¾å¼ı ï¼Ī 1 5 ä½į æĪĸèĢħ 1 8 ä½į ï¼Į æľĢåĲİ ä¸Ģ ä½į åı¯ä»¥ ä¸º åŃĹ æ¯į ï¼ī ĊĠĠĠ Ġval Ġregular Expression Ġ= Ġ"( ^[ 1 - 9 ]\\ d { 5 }( 1 8 | 1 9 | 2 0 )\\ d { 2 } (( 0 [ 1 - 9 ]) |( 1 0 | 1 1 | 1 2 )) (([ 0 - 2 ][ 1 - 9 ]) | 1 0 | 2 0 | 3 0 | 3 1 )\\ d { 3 }[ 0 - 9 Xx ]$ )| " Ġ+ Ġ"( ^[ 1 - 9 ]\\ d { 5 }\\ d { 2 } (( 0 [ 1 - 9 ]) |( 1 0 | 1 1 | 1 2 )) (([ 0 - 2 ][ 1 - 9 ]) | 1 0 | 2 0 | 3 0 | 3 1 )\\ d { 3 }$ )" ĊĠĠĠ Ġ// åģĩ è®¾ 1 8 ä½į èº«ä»½ è¯ģ åı· çłģ : 4 1 0 0 0 1 1 9 9 1 0 1 0 1 1 2 3 X ĠĠ 4 1 0 0 0 1 Ġ 1 9 9 1 0 1 0 1 Ġ 1 2 3 X ĊĠĠĠ Ġ// ^ å¼Ģ å¤´ ĊĠĠĠ Ġ// [ 1 - 9 ] Ġ ç¬¬ä¸Ģ ä½į 1 - 9 ä¸ŃçļĦ ä¸Ģä¸ª ĠĠĠĠĠĠ 4 ĊĠĠĠ Ġ// \\ d { 5 } Ġ äºĶ ä½į æķ°åŃĹ ĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 0 1 ï¼Ī åīį åħŃ ä½į çľģ å¸Ĥ åİ¿ åľ° åĮº ï¼ī ĊĠĠĠ Ġ// ( 1 8 | 1 9 | 2 0 ) ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 9 ï¼Ī çİ° éĺ¶æ®µ åı¯èĥ½ åıĸ åĢ¼ èĮĥåĽ´ 1 8 xx - 2 0 xx å¹´ ï¼ī ĊĠĠĠ Ġ// \\ d { 2 } ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 1 ï¼Ī å¹´ ä»½ ï¼ī ĊĠĠĠ Ġ// (( 0 [ 1 - 9 ]) |( 1 0 | 1 1 | 1 2 )) ĠĠĠĠĠ 0 1 ï¼Ī æľĪ ä»½ ï¼ī ĊĠĠĠ Ġ// (([ 0 - 2 ][ 1 - 9 ]) | 1 0 | 2 0 | 3 0 | 3 1 ) 0 1 ï¼Ī æĹ¥æľŁ ï¼ī ĊĠĠĠ Ġ// \\ d { 3 } Ġ ä¸ī ä½į æķ°åŃĹ ĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 3 ï¼Ī ç¬¬ åįģ ä¸ĥ ä½į å¥ĩ æķ° ä»£è¡¨ çĶ· ï¼Į åģ ¶ æķ° ä»£è¡¨ å¥³ ï¼ī ĊĠĠĠ Ġ// [ 0 - 9 Xx ] Ġ 0 1 2 3 4 5 6 7 8 9 Xx åħ¶ ä¸ŃçļĦ ä¸Ģä¸ª ĠX ï¼Ī ç¬¬ åįģ åħ« ä½į ä¸º æł¡éªĮ åĢ¼ ï¼ī ĊĠĠĠ Ġ//$ ç»ĵ å°¾ ĊĊĠĠĠ Ġ// åģĩ è®¾ 1 5 ä½į èº«ä»½ è¯ģ åı· çłģ : 4 1 0 0 0 1 9 1 0 1 0 1 1 2 3 ĠĠ 4 1 0 0 0 1 Ġ 9 1 0 1 0 1 Ġ 1 2 3 ĊĠĠĠ Ġ// ^ å¼Ģ å¤´ ĊĠĠĠ Ġ// [ 1 - 9 ] Ġ ç¬¬ä¸Ģ ä½į 1 - 9 ä¸ŃçļĦ ä¸Ģä¸ª ĠĠĠĠĠĠ 4 ĊĠĠĠ Ġ// \\ d { 5 } Ġ äºĶ ä½į æķ°åŃĹ ĠĠĠĠĠĠĠĠĠĠĠ 1 0 0 0 1 ï¼Ī åīį åħŃ ä½į çľģ å¸Ĥ åİ¿ åľ° åĮº ï¼ī ĊĠĠĠ Ġ// \\ d { 2 } ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 9 1 ï¼Ī å¹´ ä»½ ï¼ī ĊĠĠĠ Ġ// (( 0 [ 1 - 9 ]) |( 1 0 | 1 1 | 1 2 )) ĠĠĠĠĠ 0 1 ï¼Ī æľĪ ä»½ ï¼ī ĊĠĠĠ Ġ// (([ 0 - 2 ][ 1 - 9 ]) | 1 0 | 2 0 | 3 0 | 3 1 ) 0 1 ï¼Ī æĹ¥æľŁ ï¼ī ĊĠĠĠ Ġ// \\ d { 3 } Ġ ä¸ī ä½į æķ°åŃĹ ĠĠĠĠĠĠĠĠĠĠĠĠ 1 2 3 ï¼Ī ç¬¬ åįģ äºĶ ä½į å¥ĩ æķ° ä»£è¡¨ çĶ· ï¼Į åģ ¶ æķ° ä»£è¡¨ å¥³ ï¼īï¼Į 1 5 ä½į èº«ä»½ è¯ģ ä¸į åĲ« X ĊĠĠĠ Ġ//$ ç»ĵ å°¾ ĊĊĊĠĠĠ Ġval Ġmatches Ġ= ĠID Number . matches ( regular Expression . to Regex ()) ĊĊĠĠĠ Ġ// åĪ¤æĸŃ ç¬¬ 1 8 ä½į æł¡éªĮ åĢ¼ ĊĠĠĠ Ġif Ġ( matches ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ID Number . length Ġ== Ġ 1 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcharArray Ġ= ĠID Number . toCharArray () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åīį åįģ ä¸ĥ ä½į åĬł æĿĥ åĽł åŃĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Card Wi Ġ= Ġint ArrayOf ( 7 , Ġ 9 , Ġ 1 0 , Ġ 5 , Ġ 8 , Ġ 4 , Ġ 2 , Ġ 1 , Ġ 6 , Ġ 3 , Ġ 7 , Ġ 9 , Ġ 1 0 , Ġ 5 , Ġ 8 , Ġ 4 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿Ļæĺ¯ éĻ¤ ä»¥ 1 1 åĲİ ï¼Į åı¯èĥ½ äº§çĶŁ çļĦ 1 1 ä½į ä½Ļ æķ° å¯¹åºĶçļĦ éªĮè¯ģçłģ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Card Y Ġ= ĠarrayOf (" 1 ", Ġ" 0 ", Ġ" X ", Ġ" 9 ", Ġ" 8 ", Ġ" 7 ", Ġ" 6 ", Ġ" 5 ", Ġ" 4 ", Ġ" 3 ", Ġ" 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġid Card Wi . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= ĠInteger . parseInt ( char Array [ i ]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcurrent Ġ* Ġid Card Wi [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsum Ġ+= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Card Last Ġ= ĠcharArray [ 1 7 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Card Mod Ġ= Ġsum Ġ% Ġ 1 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġid Card Y [ id Card Mod ]. equals ( id Card Last . toString (), Ġignore Case Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmatches Ċ } Ċ Ċ private Ġfun Ġis StringField ( any : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġany Ġis ĠString Ċ } Ċ Ċ private Ġfun Ġis TextView Field ( any : ĠAny ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġany Ġis ĠTextView Ċ }