package Ġcom . jack n ki ar ie . captcha ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġjava . util .* ĊĊ Ċ class ĠCapt cha View Ġ: ĠView Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠmContext Ġ: ĠContext ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Text Paint : ĠPaint ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Line Paint : ĠPaint ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġverification Code : ĠString ĊĠĠĠ Ġprivate Ġvar Ġverification Code Length : ĠInt Ġ= Ġ 4 ĊĊĠĠĠ Ġprivate Ġvar Ġtext Width Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġrot ational Angle List Ġ= Ġmutable ListOf < Int >() ĊĠĠĠ Ġprivate Ġvar Ġob fusc ation Lines List Ġ= Ġmutable ListOf < Line Attributes >() ĊĠĠĠ Ġprivate Ġvar Ġalphabet Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ Ġ" A ", ĊĠĠĠĠĠĠĠ Ġ" B ", ĊĠĠĠĠĠĠĠ Ġ" C ", ĊĠĠĠĠĠĠĠ Ġ" D ", ĊĠĠĠĠĠĠĠ Ġ" E ", ĊĠĠĠĠĠĠĠ Ġ" F ", ĊĠĠĠĠĠĠĠ Ġ" G ", ĊĠĠĠĠĠĠĠ Ġ" H ", ĊĠĠĠĠĠĠĠ Ġ" I ", ĊĠĠĠĠĠĠĠ Ġ" J ", ĊĠĠĠĠĠĠĠ Ġ" K ", ĊĠĠĠĠĠĠĠ Ġ" L ", ĊĠĠĠĠĠĠĠ Ġ" M ", ĊĠĠĠĠĠĠĠ Ġ" N ", ĊĠĠĠĠĠĠĠ Ġ" O ", ĊĠĠĠĠĠĠĠ Ġ" P ", ĊĠĠĠĠĠĠĠ Ġ" Q ", ĊĠĠĠĠĠĠĠ Ġ" R ", ĊĠĠĠĠĠĠĠ Ġ" S ", ĊĠĠĠĠĠĠĠ Ġ" T ", ĊĠĠĠĠĠĠĠ Ġ" U ", ĊĠĠĠĠĠĠĠ Ġ" V ", ĊĠĠĠĠĠĠĠ Ġ" W ", ĊĠĠĠĠĠĠĠ Ġ" X ", ĊĠĠĠĠĠĠĠ Ġ" Y ", ĊĠĠĠĠĠĠĠ Ġ" Z " ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Views ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? ĊĠĠĠ Ġ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Views ( context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Views ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . mContext Ġ= Ġcontext ĊĠĠĠĠĠĠĠ Ġm Text Paint Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPaint ( Paint . LINEAR _ TEXT _ FLAG Ġor ĠPaint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠĠĠĠĠ Ġm Text Paint . color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġm Text Paint . text Size Ġ= Ġpx From Dp ( context , Ġ 2 4 f ) ĊĠĠĠĠĠĠĠ Ġtext Width Ġ= Ġpx From Dp ( context , Ġ 2 4 f ) ĊĠĠĠĠĠĠĠ Ġm Line Paint Ġ= ĠPaint () ĊĠĠĠĠĠĠĠ Ġm Line Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġm Line Paint . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠ Ġm Line Paint . color Ġ= ĠColor . BLUE ĊĠĠĠĠĠĠĠ Ġm Line Paint . stroke Width Ġ= Ġ 3 f ĊĠĠĠĠĠĠĠ Ġverification Code Ġ= Ġgenerate Verification Code ( verification Code Length ) ĊĠĠĠĠĠĠĠ Ġsetup Verification Codes Rotation Angles ( verification Code . length ) ĊĠĠĠĠĠĠĠ Ġsetup Ob fusc ation Lines () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcharacter Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġfont Width Ġ= Ġtext Width ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġverification Code . toCharArray ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . save () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . rotate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrot ational Angle List [ character Index ]. toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ/ Ġ 2 . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . toString (), Ġx . toFloat (), Ġcanvas . height Ġ/ Ġ 2 . toFloat (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Text Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . restore () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ+= Ġfont Width . toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacter Index Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġline Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 .. DEFAULT _ OB F US C ATION _ LINE _ COUNT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Line ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob fusc ation Lines List [ line Index ]. starting X Coordinate , Ġob fusc ation Lines List [ line Index ]. starting Y Coordinate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġob fusc ation Lines List [ line Index ]. ending X Coordinate , Ġob fusc ation Lines List [ line Index ]. ending Y Coordinate , Ġm Line Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Index Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrandom Alphabet : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrandom Ġ= ĠRandom () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġalphabet [ random . nextInt ( 2 5 )] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Verification Code ( verification Code Length : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpass Code String Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġverification Code Length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Code String Ġ+= Ġrandom Alphabet ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpass Code String ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Random Rotation Angle ( min : ĠInt , Ġmax : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmin Ġ+ Ġ( Math . random () Ġ* Ġ( max Ġ- Ġmin Ġ+ Ġ 1 )). toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Random Line () Ġ: ĠLine Attributes Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstarting X Coordinate Ġ= Ġ( 0 .. px From Dp ( context , Ġ 2 0 0 f ). toInt ()). random () ĊĠĠĠĠĠĠĠ Ġval Ġstarting Y Coordinate Ġ= Ġ( 0 .. px From Dp ( context , Ġ 4 0 f ). toInt ()). random () ĊĊĠĠĠĠĠĠĠ Ġval Ġending X Coordinate Ġ= Ġ( 0 .. px From Dp ( context , Ġ 2 0 0 f ). toInt ()). random () ĊĠĠĠĠĠĠĠ Ġval Ġending Y Coordinate Ġ= Ġ( 0 .. px From Dp ( context , Ġ 4 0 f ). toInt ()). random () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠLine Attributes ( starting X Coordinate . toFloat (), Ġstarting Y Coordinate . toFloat (), Ġending X Coordinate . toFloat (), Ġending Y Coordinate . toFloat ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcreate Ġa Ġlist Ġthat Ġwill Ġcontain Ġrandom Ġangle Ġto Ġbe Ġused Ġto Ġrotate Ġeach ĊĠĠĠ Ġ// Ġof Ġthe Ġverification Ġcode Ġcharacter ĊĠĠĠ Ġprivate Ġfun Ġsetup Verification Codes Rotation Angles ( verification Code Length Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( verification Code Index Ġin Ġ( 0 .. verification Code Length )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrot ational Angle List . add ( generate Random Rotation Angle ( MIN IMUM _ ROT ATION AL _ ANGLE , ĠMAX IMUM _ ROT ATION AL _ ANGLE )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcreate Ġa Ġlist Ġthat Ġwill Ġcontain Ġrandom Ġlines Ġto Ġbe Ġused Ġto Ġob fusc ate Ġthe ĊĠĠĠ Ġ// Ġverification Ġcode ĊĠĠĠ Ġprivate Ġfun Ġsetup Ob fusc ation Lines () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġ( 0 .. DEFAULT _ OB F US C ATION _ LINE _ COUNT )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġob fusc ation Lines List . add ( generate Random Line ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset TextColor ( textColor Ġ: ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Text Paint . color Ġ= ĠtextColor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Line Color ( line Color : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Line Paint . color Ġ= Ġline Color ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Verification Code Length ( verification Code Length : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . verification Code Length Ġ= Ġverification Code Length ĊĠĠĠĠĠĠĠ Ġverification Code Ġ= Ġgenerate Verification Code ( verification Code Length ) ĊĠĠĠĠĠĠĠ Ġsetup Verification Codes Rotation Angles ( verification Code Length ) ĊĠĠĠĠĠĠĠ Ġthis . invalidate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Verification Code () Ġ: ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġverification Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Input Code Valid ( input Code : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġverification Code Ġ== Ġinput Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġpx From Dp ( context : ĠContext , Ġdp : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdp Ġ* Ġcontext . resources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMIN IMUM _ ROT ATION AL _ ANGLE Ġ= Ġ- 4 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMAX IMUM _ ROT ATION AL _ ANGLE Ġ= Ġ 4 5 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ OB F US C ATION _ LINE _ COUNT Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ VER IFICATION _ CODE _ LENGTH Ġ= Ġ 4 ĊĠĠĠ Ġ} Ċ }