package Ġid . ps w . v sh launcher . views Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics .* Ċ import Ġandroid . graphics . drawable . Color Drawable Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . core . graphics . contains Ċ import Ġandroidx . core . graphics . drawable . to Bitmap Ċ import Ġandroidx . core . graphics . to Rect Ċ import Ġandroidx . core . view . children Ċ import Ġid . ps w . v sh launcher . R Ċ import Ġid . ps w . v sh launcher . choose Ċ import Ġid . ps w . v sh launcher . getSystem Padding Ċ Ċ class ĠV sh Dialog Layout Ġ: ĠViewGroup Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġdensity Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġvar Ġscaled Density Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġicon Size Ġ= Ġ 3 2 ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġd ( i : Float ): Float { return Ġi Ġ* Ġdensity ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġd ( i : Int ): Int { return Ġ( i Ġ* Ġdensity ). toInt ()} ĊĠĠĠ Ġfun Ġsd ( i : Float ): Float { return Ġi Ġ* Ġdensity ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġsd ( i : Int ): Int { return Ġ( i Ġ* Ġscaled Density ). toInt ()} ĊĠĠĠ Ġprivate Ġvar Ġpaint Text Ġ= ĠText Paint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġvar Ġpaint Fill Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġvar Ġpaint Button Un selected Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġvar Ġpaint Outline Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġvar Ġpaint Button Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠĠĠ Ġprivate Ġvar Ġselected Button Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtitle Text Ġ= Ġ" V sh Dialog Layout " ĊĠĠĠ Ġprivate Ġvar Ġicon Bitmap Ġ: ĠBitmap ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġconfirm Button Ġ= ĠKeyEvent . KEYCODE _ A ĊĊĠĠĠ Ġconstructor ( ctx : Context ): super ( ctx ){ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetTitle ( title : Int ) Ġ: ĠV sh Dialog Layout Ġ{ Ġtitle Text Ġ= Ġcontext . getString ( title ) Ġ; Ġreturn Ġthis Ġ} ĊĠĠĠ Ġfun ĠsetTitle ( title : String ) Ġ: ĠV sh Dialog Layout Ġ{ Ġtitle Text Ġ= Ġtitle ; Ġreturn Ġthis Ġ} ĊĠĠĠ Ġfun Ġset Icon ( icon : Bitmap ) Ġ: ĠV sh Dialog Layout Ġ{ Ġicon Bitmap Ġ= Ġicon ; Ġreturn Ġthis Ġ} ĊĠĠĠ Ġfun Ġset Icon ( icon : Int ) Ġ: ĠV sh Dialog Layout Ġ{ Ġicon Bitmap Ġ= Ġcontext . resources . get Drawable ( icon ). to Bitmap ( 6 4 , 6 4 ); Ġreturn Ġthis Ġ} ĊĊĠĠĠ Ġconstructor ( ctx : Context , attrs : Attribute Set ): super ( ctx , attrs ){ ĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġattributes ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . V sh Dialog Layout , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġicon Bitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . get Drawable ( R . style able . V sh Dialog Layout _ dialog Icon Bitmap )?. to Bitmap ( d ( icon Size ), Ġd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Drawable ( Color . TRANSP ARENT ). to Bitmap ( 1 , 1 ) ĊĠĠĠĠĠĠĠ Ġtitle Text Ġ= Ġa . getString ( R . style able . V sh Dialog Layout _ dialog Title Text ) Ġ?: Ġ" V sh Dialog Layout " ĊĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĠĠĠ Ġconstructor ( ctx : Context , attrs : Attribute Set , Ġstyle Res : Int ): super ( ctx , attrs , Ġstyle Res ){ ĊĊĠĠĠĠĠĠĠ Ġ// ĠLoad Ġattributes ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . V sh Dialog Layout , Ġstyle Res , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġicon Bitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . get Drawable ( R . style able . V sh Dialog Layout _ dialog Icon Bitmap )?. to Bitmap ( d ( icon Size ), Ġd ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġicon Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠColor Drawable ( Color . TRANSP ARENT ). to Bitmap ( 1 , 1 ) ĊĠĠĠĠĠĠĠ Ġtitle Text Ġ= Ġa . getString ( R . style able . V sh Dialog Layout _ dialog Title Text ) Ġ?: Ġ" V sh Dialog Layout " ĊĊĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Paint (){ ĊĠĠĠĠĠĠĠ Ġpaint Text . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġsd ( 1 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtextAlign Ġ= ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaint Outline . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstrokeWidth Ġ= Ġd ( 1 . 5 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Join Ġ= ĠPaint . Join . ROUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Cap Ġ= ĠPaint . Cap . ROUND ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= Ġ 2 5 5 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaint Fill . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaint Button Un selected . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . arg b ( 3 2 , 2 5 5 , 2 5 5 , 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpaint Button . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . arg b ( 6 4 , 2 5 5 , 2 5 5 , 2 5 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġbuttons Ġ= Ġarray ListOf < V sh Dialog View . Button >() ĊĊĠĠĠ Ġprivate Ġfun Ġinit (){ ĊĠĠĠĠĠĠĠ Ġrend Rect Ġ= Ġget System Padding () ĊĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= Ġcontext . get SharedPreferences (" x Registry . sys ", ĠContext . MODE _ PRIVATE ) ĊĠĠĠĠĠĠĠ Ġconfirm Button Ġ= Ġprefs . getBoolean (" x mb _ PS 3 _ FAT _ CE CHA 0 0 ", Ġfalse ). choose ( KeyEvent . KEYCODE _ BUTTON _ A , ĠKeyEvent . KEYCODE _ BUTTON _ B ) ĊĊĠĠĠĠĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġdensity Ġ= Ġresources . display Metrics . density ĊĠĠĠĠĠĠĠ Ġscaled Density Ġ= Ġresources . display Metrics . scaled Density ĊĠĠĠĠĠĠĠ Ġgenerate Paint () ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġvar Ġrend Rect Ġ= ĠRect () ĊĊĠĠĠ Ġoverride Ġfun Ġon Size Changed ( w : ĠInt , Ġh : ĠInt , Ġold w : ĠInt , Ġold h : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Size Changed ( w , Ġh , Ġold w , Ġold h ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġbutton Rects Ġ= Ġarray ListOf < Rect F >() ĊĊĠĠĠ Ġvar Ġoutline Path Ġ= ĠPath () ĊĠĠĠ Ġvar Ġoutline Rect Ġ= ĠRect F ( 0 f , 0 f , 0 f , 0 f ) ĊĠĠĠ Ġprivate Ġfun Ġupdate Path (){ ĊĠĠĠĠĠĠĠ Ġoutline Path . reset () ĊĠĠĠĠĠĠĠ Ġval Ġwf Ġ= Ġwidth Ġ* Ġ 1 . 1 f ĊĠĠĠĠĠĠĠ Ġval Ġbar Height Ġ= Ġrend Rect . height () Ġ* Ġ 0 . 1 5 f ĊĠĠĠĠĠĠĠ Ġoutline Path . moveTo (- 1 0 f , Ġbar Height ) ĊĠĠĠĠĠĠĠ Ġoutline Path . lineTo ( wf , Ġ Ġbar Height ) ĊĠĠĠĠĠĠĠ Ġoutline Path . lineTo ( wf , Ġheight Ġ- Ġbar Height ) ĊĠĠĠĠĠĠĠ Ġoutline Path . lineTo ( Ġ- 1 0 f , Ġheight Ġ- Ġbar Height ) ĊĠĠĠĠĠĠĠ Ġoutline Path . close () ĊĊĠĠĠĠĠĠĠ Ġoutline Rect . set ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 0 f , Ġbar Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwf , Ġheight Ġ- Ġbar Height ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Click ableView Accessibility ") ĊĠĠĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġretval Ġ Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġre calculate Button Size () ĊĊĠĠĠĠĠĠĠ Ġif ( event Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch Pos Ġ= ĠPoint F ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġbuttons . indices ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( button Rects [ i ]. contains ( touch Pos )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuttons [ i ]. run nable . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretval Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġretval Ġ|| Ġsuper . on Touch Event ( event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre calculate Button Size (){ ĊĠĠĠĠĠĠĠ Ġbutton Rects . clear () ĊĠĠĠĠĠĠĠ Ġif ( buttons . size Ġ< Ġ 1 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġbtn Width Ġ= Ġrend Rect . width () Ġ/ Ġbuttons . size ĊĠĠĠĠĠĠĠ Ġval Ġrender Height Ġ= Ġrend Rect . height () ĊĠĠĠĠĠĠĠ Ġval Ġpadding Size Ġ= Ġd ( 3 f ) ĊĠĠĠĠĠĠĠ Ġbuttons . forEach Indexed Ġ{ Ġindex , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton Rects . add ( Rect F ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( btn Width Ġ* Ġindex . toFloat ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( render Height Ġ* Ġ 0 . 8 5 f ) Ġ+ Ġpadding Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( btn Width Ġ* Ġ( index Ġ+ Ġ 1 f )) Ġ- Ġpadding Size Ġ+ Ġrend Rect . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( render Height Ġ* Ġ 1 f ) Ġ- Ġpadding Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Button ( new Buttons Ġ: ĠArrayList < V sh Dialog View . Button > ){ ĊĠĠĠĠĠĠĠ Ġbuttons Ġ= Ġnew Buttons ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Button ( text : String , Ġrunnable : ()-> Unit ){ ĊĠĠĠĠĠĠĠ Ġbuttons . add ( V sh Dialog View . Button ( text , ĠRunnable Ġ{ Ġrunnable () Ġ})) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Button ( res Id : Int , Ġrunnable : Ġ() Ġ-> ĠUnit ){ ĊĠĠĠĠĠĠĠ Ġbuttons . add ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV sh Dialog View . Button ( context . getString ( res Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRunnable Ġ{ Ġrunnable () Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCanvas . draw Text With Y Offset ( text : String , Ġx : Float , Ġy : Float , Ġpaint : Paint , Ġy Off Ġ: ĠFloat Ġ= Ġ 0 . 5 f ){ ĊĠĠĠĠĠĠĠ Ġval Ġy Calc Ġ= Ġy Ġ+ Ġ( paint . text Size Ġ* Ġy Off ) ĊĠĠĠĠĠĠĠ Ġthis . draw Text ( text , x , y Calc , paint ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġm Update ( canvas : Canvas ){ ĊĊĠĠĠĠĠĠĠ Ġupdate Path () ĊĠĠĠĠĠĠĠ Ġre calculate Button Size () ĊĊĊĊĠĠĠĠĠĠĠ Ġcanvas . draw ARGB ( 1 2 8 , 0 , 0 , 0 ) ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( outline Rect , Ġpaint Outline ) ĊĠĠĠĠĠĠĠ Ġpaint Text . textAlign Ġ= ĠPaint . Align . LEFT ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Padding Ġ= Ġd ( 5 0 f ) Ġ+ Ġrend Rect . left ĊĊĠĠĠĠĠĠĠ Ġcanvas . draw Text With Y Offset ( title Text , Ġleft Padding , outline Rect . top Ġ- Ġsd ( 2 0 f ), paint Text , 0 f ) ĊĠĠĠĠĠĠĠ Ġif ( icon Bitmap Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Bitmap ( icon Bitmap !! , Ġleft Padding Ġ- Ġd ( 4 0 f ), Ġoutline Rect . top Ġ- Ġd ( 1 0 f ) Ġ- Ġd ( 3 2 f ), Ġpaint Fill ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpaint Text . textAlign Ġ= ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠ Ġbutton Rects . forEach Indexed Ġ{ Ġindex , Ġrect F Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbtn Ġ= Ġbuttons [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( rect F , Ġ( index Ġ== Ġselected Button Index ). choose ( paint Button , Ġpaint Button Un selected )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text With Y Offset ( btn . text , Ġrect F . center X (), Ġrect F . center Y (), Ġpaint Text Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġupdate Path () ĊĠĠĠĠĠĠĠ Ġval Ġo Rect Ġ= Ġoutline Rect . to Rect () ĊĠĠĠĠĠĠĠ Ġval Ġr Rect Ġ= Ġrend Rect ĊĠĠĠĠĠĠĠ Ġval Ġw Spec Ġ= ĠMeasure Spec . make Measure Spec ( r Rect . width (), ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġval Ġh Spec Ġ= ĠMeasure Spec . make Measure Spec ( o Rect . height (), ĠMeasure Spec . EX ACT LY ) ĊĠĠĠĠĠĠĠ Ġmeasure Children ( w Spec , Ġh Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Layout ( changed : ĠBoolean , Ġleft : ĠInt , Ġtop : ĠInt , Ġright : ĠInt , Ġbottom : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Path () ĊĠĠĠĠĠĠĠ Ġval Ġo Rect Ġ= Ġoutline Rect . to Rect () ĊĠĠĠĠĠĠĠ Ġval Ġr Rect Ġ= Ġrend Rect ĊĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . layout ( left , Ġo Rect . top , Ġright Ġ+ Ġleft , Ġo Rect . bottom ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispatch Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . dispatch Draw ( canvas ) ĊĠĠĠĠĠĠĠ Ġset Will Not Draw ( false ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( canvas Ġ!= Ġnull ) Ġm Update ( canvas ) ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĠĠĠ Ġ} Ċ Ċ }