package Ġcom . ang cy o . u iv iew . widget čĊč Ċ import Ġandroid . content . Context č Ċ import Ġandroid . graphics . Canvas č Ċ import Ġandroid . graphics . Color č Ċ import Ġandroid . graphics . Paint č Ċ import Ġandroid . graphics . Rect č Ċ import Ġandroid . support . v 7 . widget . AppCompat EditText č Ċ import Ġandroid . text . Input Filter č Ċ import Ġandroid . text . method . Digits Key Listener č Ċ import Ġandroid . text . method . Key Listener č Ċ import Ġandroid . util . Attribute Set č Ċ import Ġandroid . util . Typed Value č Ċ import Ġandroid . view . ContextMenu č Ċ import Ġandroid . view . Motion Event č Ċ import Ġandroid . view . View č Ċ import Ġandroid . view . input method . Editor Info č Ċ import Ġcom . ang cy o . u iv iew . R č Ċ import Ġcom . ang cy o . u iv iew . kotlin .* č Ċ import Ġcom . ang cy o . u iv iew . skin . Skin Helper čĊč Ċ /** čĊ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 6 , æ·± åľ ³ å¸Ĥ çº¢ é¸ Ł ç½ĳç»ľ ç§ĳ æĬĢ èĤ¡ ä»½ æľī éĻĲ åħ¬åı¸ ĠAll Ġrights Ġreserved . čĊ Ġ* Ġ é¡¹çĽ® åĲįç§° ï¼ļ čĊ Ġ* Ġ ç±»çļĦ æııè¿° ï¼ļ čĊ Ġ* ĠåĪĽå»º äººåĳĺ ï¼ļ Rob i čĊ Ġ* ĠåĪĽå»º æĹ¶éĹ´ ï¼ļ 2 0 1 7 / 0 7 / 0 4 Ġ 1 6 : 5 2 čĊ Ġ* Ġä¿®æĶ¹ äººåĳĺ ï¼ļ Rob i čĊ Ġ* Ġä¿®æĶ¹ æĹ¶éĹ´ ï¼ļ 2 0 1 7 / 0 7 / 0 4 Ġ 1 6 : 5 2 čĊ Ġ* Ġä¿®æĶ¹ å¤ĩ æ³¨ ï¼ļ čĊ Ġ* ĠVersion : Ġ 1 . 0 . 0 čĊ Ġ*/ č Ċ class ĠPassword Input EditText ( context : ĠContext , Ġattribute Set : ĠAttributeSet ? Ġ= Ġnull ) čĊĠĠĠ Ġ: ĠAppCompat EditText ( context , Ġattribute Set ) Ġ{ čĊčĊĠĠĠ Ġ/** éľĢè¦ģ è¾ĵåħ¥ å¯Ĩçłģ çļĦ æķ°éĩı */ čĊĠĠĠ Ġvar Ġpassword Count Ġ= Ġ 4 čĊčĊĠĠĠ Ġ/** å¯Ĩçłģ ä¸İ å¯Ĩçłģ ä¹ĭéĹ´çļĦ éĹ´ éļ Ļ */ čĊĠĠĠ Ġvar Ġpassword Space : ĠFloat Ġ= Ġ 1 0 Ġ* Ġdensity čĊčĊĠĠĠ Ġ/** å¯Ĩçłģ æıĲç¤º æ¡Ĩ çļĦ å¤§å°ı , Ġå½ĵ ç©º éļ Ļ ä¸º 0 æĹ¶ , Ġ èĩªåĬ¨ å±Ĥ åı ł è¾¹ æ¡Ĩ , Ġå°ı äºİ çŃīäºİ 0 æĹ¶ , Ġ èĩªåĬ¨ å¹³ åĪĨ View çļĦ å®½åº¦ */ čĊĠĠĠ Ġvar Ġpassword Size : ĠFloat Ġ= Ġ 3 0 Ġ* Ġdensity čĊčĊĠĠĠ Ġ/** ç»ĺ åĪ¶ å¯Ĩçłģ çļĦ å¤§å°ı æ¯Ķ ä¾ĭ */ čĊĠĠĠ Ġvar Ġpassword Draw Size Scale : ĠFloat Ġ= Ġ 0 . 6 f čĊčĊĠĠĠ Ġ/** æĭ Ĩ åĪĨ æĪĲ å®½åº¦ åĴĮ é«ĺåº¦ */ čĊĠĠĠ Ġvar Ġpassword Width : ĠFloat Ġ= Ġ 3 0 Ġ* Ġdensity čĊĠĠĠ Ġvar Ġpassword Height : ĠFloat Ġ= Ġ 3 0 Ġ* Ġdensity čĊčĊĠĠĠ Ġvar ĠstrokeWidth Ġ= Ġ 2 Ġ* Ġdensity čĊčĊĠĠĠ Ġvar Ġpassword Highlight Color Ġ= ĠColor . RED čĊĠĠĠ Ġ/* èĥĮæĻ¯ é¢ľèī² */ čĊĠĠĠ Ġvar Ġpassword Bg Color Ġ= ĠColor . TRANSP ARENT čĊĠĠĠ Ġ/* å¯Ĩçłģ çļĦ é¢ľèī² */ čĊĠĠĠ Ġvar Ġpassword Color Ġ= ĠColor . GRAY čĊčĊĠĠĠ Ġ/** è¾¹ æ¡Ĩ çļĦ é¢ľèī² */ čĊĠĠĠ Ġvar Ġpassword BorderColor Ġ= ĠColor . parse Color ("# E 0 E 0 E 0 ") čĊčĊĠĠĠ Ġ/** å¯Ĩçłģ ä¸įåı¯ è§ģ æĹ¶çļĦ æıĲç¤º æł·å¼ı */ čĊĠĠĠ Ġvar Ġpassword Tip Type Ġ= ĠT IP _ TYPE _ CIR CLE čĊčĊĠĠĠ Ġ/** æĺ¯åĲ¦ éľĢè¦ģ æĺ¾ç¤º é«ĺ äº ® æ¡Ĩ */ čĊĠĠĠ Ġvar Ġshow Highlight Ġ= Ġtrue čĊčĊĠĠĠ Ġprivate Ġvar Ġold Key Listener : ĠKey Listener ? Ġ= Ġnull čĊčĊĠĠĠ Ġ/** æĺ¯åĲ¦ æ¿Ģ æ´» å¯Ĩçłģ è¾ĵåħ¥ */ čĊĠĠĠ Ġvar Ġenable Password Input Ġ= Ġtrue čĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġtrue čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Key Listener ?. let Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . key Listener Ġ= Ġit čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Enabled Ġ= Ġfalse čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Key Listener Ġ= Ġkey Listener čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Listener Ġ= Ġnull čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠ Ġcompanion Ġobject Ġ{ čĊĠĠĠĠĠĠĠ Ġ/** çĶ» åľĨ */ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT IP _ TYPE _ CIR CLE Ġ= Ġ 1 čĊĠĠĠĠĠĠĠ Ġ/** çĶ» çľŁ å®ŀ æķ°åŃĹ */ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT IP _ TYPE _ RAW Ġ= Ġ 2 čĊĠĠĠĠĠĠĠ Ġ/** çĶ» çŁ© å½¢ */ čĊĠĠĠĠĠĠĠ Ġconst Ġval ĠT IP _ TYPE _ RECT Ġ= Ġ 3 čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġpaint : ĠPaint Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) čĊĠĠĠĠĠĠĠ Ġp . stroke Width Ġ= ĠstrokeWidth čĊĠĠĠĠĠĠĠ Ġp čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġtext Raw Paint : ĠPaint Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) čĊĠĠĠĠĠĠĠ Ġp čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġrect : ĠRect Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ ĠRect () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġval Ġhighlight Rect : ĠRect Ġby Ġlazy Ġ{ čĊĠĠĠĠĠĠĠ ĠRect () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġinit Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġcontext . obtain Styled Attributes ( attribute Set , ĠR . style able . Password Input EditText ) čĊĠĠĠĠĠĠĠ Ġpassword Count Ġ= Ġarray . getInt ( R . style able . Password Input EditText _ r _ password _ count , Ġpassword Count ) čĊĠĠĠĠĠĠĠ Ġpassword Draw Size Scale Ġ= Ġarray . get Float ( R . style able . Password Input EditText _ r _ password _ draw _ size _ scale , Ġpassword Draw Size Scale ) čĊĠĠĠĠĠĠĠ Ġpassword Space Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Password Input EditText _ r _ password _ space , Ġpassword Space . toInt ()). toFloat () čĊĠĠĠĠĠĠĠ Ġpassword Size Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Password Input EditText _ r _ password _ size , Ġpassword Size . toInt ()). toFloat () čĊčĊĠĠĠĠĠĠĠ Ġpassword Height Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Password Input EditText _ r _ password _ height , Ġpassword Size . toInt ()). toFloat () čĊĠĠĠĠĠĠĠ Ġpassword Width Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Password Input EditText _ r _ password _ width , Ġpassword Size . toInt ()). toFloat () čĊčĊĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġarray . get Dimension Pixel Offset ( R . style able . Password Input EditText _ r _ border _ width , ĠstrokeWidth . toInt ()). toFloat () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ(! isIn Edit Mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Highlight Color Ġ= ĠSk in Helper . get Skin (). theme Sub Color čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġpassword Highlight Color Ġ= Ġarray . getColor ( R . style able . Password Input EditText _ r _ password _ highlight _ color , Ġpassword Highlight Color ) čĊĠĠĠĠĠĠĠ Ġpassword Bg Color Ġ= Ġarray . getColor ( R . style able . Password Input EditText _ r _ password _ bg _ color , Ġpassword Bg Color ) čĊĠĠĠĠĠĠĠ Ġpassword Color Ġ= Ġarray . getColor ( R . style able . Password Input EditText _ r _ password _ color , Ġpassword Color ) čĊĠĠĠĠĠĠĠ Ġpassword BorderColor Ġ= Ġarray . getColor ( R . style able . Password Input EditText _ r _ password _ border _ color , Ġpassword BorderColor ) čĊčĊĠĠĠĠĠĠĠ Ġshow Highlight Ġ= Ġarray . getBoolean ( R . style able . Password Input EditText _ r _ show _ highlight , Ġshow Highlight ) čĊĠĠĠĠĠĠĠ Ġpassword Tip Type Ġ= Ġarray . getInt ( R . style able . Password Input EditText _ r _ password _ tip _ type , Ġpassword Tip Type ) čĊčĊĠĠĠĠĠĠĠ Ġval Ġenable Input Ġ= Ġarray . getBoolean ( R . style able . Password Input EditText _ r _ enable _ password _ input , Ġenable Password Input ) čĊčĊĠĠĠĠĠĠĠ Ġarray . recycle () čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( password Tip Type Ġ== ĠT IP _ TYPE _ RAW ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Raw Paint . set ( get Paint ()) čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġset BackgroundColor ( Color . TRANSP ARENT ) čĊĠĠĠĠĠĠĠ Ġset TextColor ( Color . TRANSP ARENT ) čĊĠĠĠĠĠĠĠ Ġis Cursor Visible Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġset Text Size ( Typed Value . COMPLEX _ UNIT _ PX , Ġ 0 f ) čĊĠĠĠĠĠĠĠ Ġset Text Is Selectable ( false ) čĊĠĠĠĠĠĠĠ Ġinput Type Ġ= ĠEditor Info . TYPE _ CLASS _ NUMBER čĊĠĠĠĠĠĠĠ Ġfilters Ġ= ĠarrayOf ( Input Filter . Length Filter ( password Count )) čĊĠĠĠĠĠĠĠ Ġ ime Options Ġ= Ġ ime Options Ġor ĠEditor Info . IME _ FLAG _ NO _ EXTRACT _ UI čĊĠĠĠĠĠĠĠ Ġkey Listener Ġ= ĠDig its Key Listener . getInstance (" 1 2 3 4 5 6 7 8 9 0 ") čĊčĊĠĠĠĠĠĠĠ Ġif Ġ(! enable Input ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Password Input Ġ= Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġvar Ġwidth Size Ġ= ĠView . Measure Spec . getSize ( width Measure Spec ) čĊĠĠĠĠĠĠĠ Ġval Ġwidth Mode Ġ= ĠView . Measure Spec . get Mode ( width Measure Spec ) čĊĠĠĠĠĠĠĠ Ġvar Ġheight Size Ġ= ĠView . Measure Spec . getSize ( height Measure Spec ) čĊĠĠĠĠĠĠĠ Ġval Ġheight Mode Ġ= ĠView . Measure Spec . get Mode ( height Measure Spec ) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( password Size Ġ<= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Width Ġ= Ġ(( width Size Ġ- Ġpadding Left Ġ- Ġpadding Right ) Ġ/ Ġpassword Count ). toFloat () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( width Mode Ġ!= ĠView . Measure Spec . EX ACT LY ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( password Space Ġ== Ġ 0 f ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Size Ġ= Ġ( password Count Ġ* Ġpassword Width Ġ+ ĠstrokeWidth Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ+ Ġpadding Right ). toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Size Ġ= Ġ( password Count Ġ* Ġ( password Width Ġ+ ĠstrokeWidth ) Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMath . max ( password Count Ġ- Ġ 1 , Ġ 0 ) Ġ* Ġpassword Space Ġ+ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Left Ġ+ Ġpadding Right ). toInt () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( height Mode Ġ!= ĠView . Measure Spec . EX ACT LY ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Size Ġ= Ġ( password Height Ġ+ ĠstrokeWidth Ġ+ Ġpadding Top Ġ+ Ġpadding Bottom ). toInt () čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( width Size , Ġheight Size ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġcreate ContextMenu ( menu : ĠContext Menu ?) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// super . create ContextMenu ( menu ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon TextChanged ( text : ĠCharSequence ?, Ġstart : ĠInt , Ġlength Before : ĠInt , Ġlength After : ĠInt ) Ġ{ čĊĠĠĠĠĠĠĠ Ġsuper . on TextChanged ( text , Ġstart , Ġlength Before , Ġlength After ) čĊčĊĠĠĠĠĠĠĠ Ġif Ġ( text ?. length Ġ== Ġpassword Count Ġ&& Ġpassword Count Ġ!= Ġ 0 ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// T _. show (" æľ¬ æ¬¡ å¯Ĩçłģ :$ text ") čĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Password Input Listener ?. on Password ( text ?. toString ()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġis Focused (): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( isIn Edit Mode ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . is Focused () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ čĊĠĠĠĠĠĠĠ Ġ// canvas . draw Color ( Color . parse Color ("# 4 0 0 0 0 0 0 0 ")) čĊĠĠĠĠĠĠĠ Ġpaint . stroke Width Ġ= ĠstrokeWidth čĊĠĠĠĠĠĠĠ Ġhighlight Rect . set Empty () čĊčĊĠĠĠĠĠĠĠ Ġvar Ġleft : ĠFloat čĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpassword Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( password Space Ġ== Ġ 0 f ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġpadding Left Ġ+ Ġpassword Width Ġ* Ġi Ġ+ ĠstrokeWidth Ġ/ Ġ 2 čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Ġ= Ġpadding Left Ġ+ ĠstrokeWidth Ġ/ Ġ 2 Ġ+ Ġ( password Width Ġ+ ĠstrokeWidth ) Ġ* Ġi Ġ+ ĠMath . max ( i , Ġ 0 ) Ġ* Ġpassword Space čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . set ( left . toInt (), Ġ( padding Top Ġ+ ĠstrokeWidth Ġ/ Ġ 2 ). toInt (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( left Ġ+ Ġpassword Width ). toInt (), Ġ( padding Top Ġ+ ĠstrokeWidth Ġ/ Ġ 2 Ġ+ Ġpassword Height ). toInt ()) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¡« åħħ å¯Ĩçłģ æ¡Ĩ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL _ AND _ ST RO KE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword Bg Color čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ å¤ĸ æ¡Ĩ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . ST RO KE čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Focused Ġ&& Ġtext ?. length Ġ?: Ġ 0 Ġ== Ġi ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// é«ĺ äº ® é¢ľèī² čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( show Highlight ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword Highlight Color čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword BorderColor čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlight Rect . set ( rect ) čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword BorderColor čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect , Ġpaint ) čĊčĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ç»ĺ åĪ¶ åĨħ æ¡Ĩ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text ?. length Ġ?: Ġ 0 Ġ> Ġi ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL _ AND _ ST RO KE čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword Color čĊčĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( password Tip Type ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT IP _ TYPE _ CIR CLE Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Circle ( rect . center X (). toFloat (), Ġrect . center Y (). toFloat (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Width . max Value ( password Height ) Ġ* Ġpassword Draw Size Scale Ġ/ Ġ 2 , Ġpaint ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT IP _ TYPE _ RECT Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġoffset Ġ= Ġ 4 Ġ* Ġdensity čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Offset Ġ= Ġrect . width () Ġ* Ġ( 1 Ġ- Ġpassword Draw Size Scale ) Ġ/ Ġ 2 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheight Offset Ġ= Ġrect . height () Ġ* Ġ( 1 Ġ- Ġpassword Draw Size Scale ) Ġ/ Ġ 2 čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect . left Ġ+ Ġwidth Offset , Ġrect . top Ġ+ Ġheight Offset , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . right Ġ- Ġwidth Offset , Ġrect . bottom Ġ- Ġheight Offset , Ġpaint ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT IP _ TYPE _ RAW Ġ-> Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġtext . toString ()[ i ]. toString () čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Raw Paint . color Ġ= Ġpassword Color čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( text . toString ()[ i ]. toString (), čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . center X () Ġ- Ġtext Width ( text Raw Paint , Ġs ) Ġ/ Ġ 2 , čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . center Y () Ġ+ Ġtext Height ( text Raw Paint ) Ġ/ Ġ 2 Ġ- Ġtext Raw Paint . desc ent (), Ġtext Raw Paint ) čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġ// é«ĺ äº ® å¤ĦçĲĨ čĊĠĠĠĠĠĠĠ Ġif Ġ( password Space Ġ== Ġ 0 f Ġ&& Ġshow Highlight ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĹ´ éļ Ļ çŃīäºİ 0 æĹ¶ , Ġ é«ĺ äº ® çļĦ çŁ© å½¢ ä¼ļ è¢« å·¦ åı³ çļĦ çŁ© å½¢ è¦ĨçĽĸ , Ġ æīĢä»¥ éľĢè¦ģ éĩįæĸ° ç»ĺ åĪ¶ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġpassword Highlight Color čĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( highlight Rect , Ġpaint ) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġ/** æĺ¯åĲ¦ è¾ĵåħ¥ æľī è¯¯ */ čĊĠĠĠ Ġfun Ġis Input Error (): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( text . isNull OrEmpty ()) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġif Ġ( text ?. length Ġ?: Ġ 0 Ġ!= Ġpassword Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue čĊĠĠĠĠĠĠĠ Ġ} čĊčĊĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġstring (): ĠString Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġraw Text Ġ= Ġtext . toString (). trim () čĊĠĠĠĠĠĠĠ Ġreturn Ġraw Text čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġdel Input () Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ( enable Password Input ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġdel () čĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġstring () čĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Input Text ( new Text . sub Sequence ( 0 , Ġ 0 . min Value ( new Text . length Ġ- Ġ 1 )). toString ()) čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġfun Ġinsert Input ( input : ĠString ) Ġ{ čĊĠĠĠĠĠĠĠ Ġval Ġold Length Ġ= Ġstring (). length čĊĠĠĠĠĠĠĠ Ġif Ġ( old Length Ġ>= Ġpassword Count ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// å·²ç»ı è¾ĵåħ¥ æ»¡ äºĨ å¯Ĩçłģ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġstring () Ġ+ Ġinput čĊĠĠĠĠĠĠĠ Ġset Input Text ( new Text . sub Sequence ( 0 , Ġpassword Count . max Value ( new Text . length )). toString ()) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ čĊĠĠĠĠĠĠĠ Ġif Ġ(! isEnabled ) Ġ{ čĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse čĊĠĠĠĠĠĠĠ Ġ} čĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġvar Ġon Password Input Listener : ĠOn Password Input Listener ? Ġ= Ġnull čĊčĊĠĠĠ Ġopen Ġinterface ĠOn Password Input Listener Ġ{ čĊĠĠĠĠĠĠĠ Ġfun Ġon Password ( password : ĠString ) čĊĠĠĠ Ġ} č Ċ }