package Ġcom . sp es hi ou . android . common . ui . utils Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . text . Layout Ċ import Ġandroid . text . Static Layout Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . util . Typed Value Ċ import Ġandroidx . core . graphics . drawable . Drawable Compat Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . view . input method . Input Method Manager Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroid . view . Motion Event Ċ import Ġkotlin . math . abs ĊĊ Ċ class ĠView Utils () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Styled Color ( context : ĠContext , Ġattr Id : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtyped Value Ġ= ĠTyped Value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( typed Value . data , Ġint ArrayOf ( attr Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġa . getColor ( 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcolor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġt int MenuItem ( menuItem : ĠMenuItem , Ġcolor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Item . icon Ġ= Ġt int Drawable ( menuItem . icon , Ġcolor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġt int Drawable ( drawable : ĠDrawable , Ġcolor : ĠInt ): ĠDrawable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= ĠDrawable Compat . wrap ( drawable ). mutate () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( drawable , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdrawable ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġt int Compound Drawable ( textView : ĠTextView , Ġcolor : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( drawable Ġin ĠtextView . compound Draw ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrawable Compat . set Tint ( drawable , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġapply Compound Drawable Size ( textView : ĠTextView , Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( drawable Ġin ĠtextView . compound Draw ables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġ( drawable . intrinsic Width Ġ- Ġsize ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable . setBounds ( x , Ġx , Ġsize , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġshow Soft Keyboard ( view : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimm Ġ= Ġview . context . getSystem Service ( Context . INPUT _ METHOD _ SERVICE ) Ġas ĠInput Method Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimm . show Soft Input ( view , ĠInput Method Manager . SHOW _ IMP LICIT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdis allow Intercept Touch Event ( re cyclerView : ĠRecyclerView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cyclerView . add On Item Touch Listener ( object Ġ: ĠRecyclerView . On Item Touch Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart X : ĠFloat Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Y : ĠFloat Ġ= Ġ- 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Intercept Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġe . action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Ġ= Ġe . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Ġ= Ġe . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( abs ( e . x Ġ- Ġstart X ) Ġ> Ġabs ( e . y Ġ- Ġstart Y )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv . parent . request Dis allow Intercept Touch Event ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrv . parent . request Dis allow Intercept Touch Event ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Touch Event ( rv : ĠRecyclerView , Ġe : ĠMotion Event ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Request Dis allow Intercept Touch Event ( dis allow Intercept : ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġmeasure TextView Height ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext : ĠCharSequence , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size : ĠInt , Ġ// Ġin Ġpixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Width : ĠInt , Ġ// Ġin Ġpixels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpadding : ĠInt Ġ// Ġin Ġpixels ĊĠĠĠĠĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Text Paint Ġ= ĠText Paint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Text Paint . is Anti Alias Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġhow Ġyou Ġwould Ġconvert Ġsp Ġto Ġpixels Ġbased Ġon Ġscreen Ġdensity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// my Text Paint . setText Size ( 1 6 Ġ* Ġcontext . getResources (). getDisplay Metrics (). density ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Text Paint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalignment Ġ= ĠLayout . Alignment . ALIGN _ NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspacing Multiplier Ġ= Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġspacing Addition Ġ= Ġpadding . toFloat () Ġ// Ġoptionally Ġapply Ġpadding Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinclude Padding Ġ= Ġpadding Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Static Layout Ġ= ĠStatic Layout ( text , Ġmy Text Paint , Ġdevice Width , Ġalignment , Ġspacing Multiplier , Ġspacing Addition , Ġinclude Padding ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Static Layout . height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }