package Ġbr . com . gov ote . android . libs . ui Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Color Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Paint . Style Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Typed Value Ċ import Ġandroid . view . Motion Event Ċ import Ġandroid . view . View Configuration Ċ import Ġandroidx . appcompat . widget . AppCompat ImageView Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġbr . com . gov ote . android . libs . R Ċ import Ġbr . com . gov ote . android . libs . utils . Dimension Utils Ċ import Ġjava . math . BigDecimal Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ class ĠRange Seek Bar < T Ġ: ĠNumber > Ġ: ĠAppCompat ImageView Ġ{ ĊĊĠ Ġprivate Ġval Ġpaint Ġ= ĠPaint ( Paint . ANTI _ ALIAS _ FLAG ) ĊĠ Ġprivate Ġvar Ġdefault Color : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġthumb Image : ĠBitmap ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġthumb Half Height : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠ Ġprivate Ġvar Ġthumb Half Width : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠ Ġprivate Ġvar Ġinitial Padding : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠ Ġprivate Ġvar Ġpadding : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġabsolute Ġminimum Ġvalue Ġof Ġthe Ġrange Ġthat Ġhas Ġbeen Ġset Ġat Ġconstruction Ġtime . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠThe Ġabsolute Ġminimum Ġvalue Ġof Ġthe Ġrange . ĊĠĠ Ġ*/ ĊĠ Ġvar Ġabsolute MinValue : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġset ĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġabsolute Ġmaximum Ġvalue Ġof Ġthe Ġrange Ġthat Ġhas Ġbeen Ġset Ġat Ġconstruction Ġtime . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ return ĠThe Ġabsolute Ġmaximum Ġvalue Ġof Ġthe Ġrange . ĊĠĠ Ġ*/ ĊĠ Ġvar Ġabsolute MaxValue : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġset ĊĠ Ġprivate Ġvar Ġnumber Type : ĠNumber Type ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġabsolute MinValue Prim : ĠDouble Ġ= Ġ 0 . toDouble () ĊĠ Ġprivate Ġvar Ġabsolute MaxValue Prim : ĠDouble Ġ= Ġ 0 . toDouble () ĊĠ Ġprivate Ġvar Ġnormalized MinValue Ġ= Ġ 0 . 0 ĊĠ Ġprivate Ġvar Ġnormalized MaxValue Ġ= Ġ 1 . 0 ĊĠ Ġprivate Ġvar Ġpressed Thumb : ĠThumb ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġis Notify While Dragging Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġlistener : ĠOn Range Seek Bar ChangeListener < T >? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġdown Motion X : ĠFloat Ġ= Ġ 0 . toFloat () ĊĠ Ġprivate Ġvar Ġactive Pointer Id Ġ= ĠINVALID _ POINTER _ ID ĊĠ Ġprivate Ġvar Ġscaled Touch S lop : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġis Dragging : ĠBoolean Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġtext Offset : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġtext Size : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġdistance To Top : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġrect : ĠRect F ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġsingle Thumb : ĠBoolean Ġ= Ġfalse ĊĊĠ Ġprivate Ġvar Ġactive Seek Bar Color : ĠInt Ġ= Ġ 0 ĊĠ Ġprivate Ġvar Ġdefault Seek Bar Color : ĠInt Ġ= Ġ 0 ĊĊĠ Ġ// Ġin Ġcase Ġabsolute MinValue Ġ== Ġabsolute MaxValue , Ġavoid Ġdivision Ġby Ġzero Ġwhen Ġnormal izing . ĊĠ Ġprivate Ġvar Ġselected MinValue : ĠT ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrently Ġselected Ġmin Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcurrently Ġselected Ġmin Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġget () Ġ= Ġnormalized To Value ( normalized MinValue ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġcurrently Ġselected Ġminimum Ġvalue . ĠThe Ġwidget Ġwill Ġbe Ġinvalid ated Ġand Ġredraw n . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe ĠNumber Ġvalue Ġto Ġset Ġthe Ġminimum Ġvalue Ġto . ĠWill Ġbe Ġclamp ed Ġto Ġgiven Ġabsolute Ġminimum / maximum Ġrange . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġset ( value ) Ġ= Ġif Ġ( 0 . 0 Ġ== Ġabsolute MaxValue Prim Ġ- Ġabsolute MinValue Prim ) Ġ{ ĊĠĠĠĠĠ Ġset Normalized MinValue ( 0 . 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġset Normalized MinValue ( value To Normalized ( value )) ĊĠĠĠ Ġ} ĊĊĠ Ġ// Ġin Ġcase Ġabsolute MinValue Ġ== Ġabsolute MaxValue , Ġavoid Ġdivision Ġby Ġzero Ġwhen Ġnormal izing . ĊĠ Ġprivate Ġvar Ġselected MaxValue : ĠT ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcurrently Ġselected Ġmax Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcurrently Ġselected Ġmax Ġvalue . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġget () Ġ= Ġnormalized To Value ( normalized MaxValue ) ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġcurrently Ġselected Ġmaximum Ġvalue . ĠThe Ġwidget Ġwill Ġbe Ġinvalid ated Ġand Ġredraw n . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue ĠThe ĠNumber Ġvalue Ġto Ġset Ġthe Ġmaximum Ġvalue Ġto . ĠWill Ġbe Ġclamp ed Ġto Ġgiven Ġabsolute Ġminimum / maximum Ġrange . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġset ( value ) Ġ= Ġif Ġ( 0 . 0 Ġ== Ġabsolute MaxValue Prim Ġ- Ġabsolute MinValue Prim ) Ġ{ ĊĠĠĠĠĠ Ġset Normalized MaxValue ( 1 . 0 ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġset Normalized MaxValue ( value To Normalized ( value )) ĊĠĠĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠ Ġinit ( context , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġinit ( context , Ġattrs ) ĊĠ Ġ} ĊĊĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style : ĠInt ) Ġ: Ġsuper ( context , Ġattrs , Ġdef Style ) Ġ{ ĊĠĠĠ Ġinit ( context , Ġattrs ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġextract Numeric Value From Attributes ( a : ĠTyped Array , Ġattribute : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue : ĠInt ): ĠT Ġ{ ĊĠĠĠ Ġval Ġtv Ġ= Ġa . peek Value ( attribute ) Ġ?: Ġreturn ĠInteger . valueOf ( defaultValue ) Ġas ĠT ĊĠĠĠ Ġval Ġtype Ġ= Ġtv . type ĊĊĠĠĠ Ġreturn Ġif Ġ( type Ġ== ĠTyped Value . TYPE _ FLOAT ) Ġ{ ĊĠĠĠĠĠ Ġjava . lang . Float . valueOf ( a . get Float ( attribute , ĠdefaultValue . toFloat ())) Ġas ĠT ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ ĠInteger . valueOf ( a . getInteger ( attribute , ĠdefaultValue )) Ġas ĠT ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġinit ( context : ĠContext , Ġattrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠ Ġval Ġattributes Ġ= ĠgetContext (). obtain Styled Attributes ( attrs , ĠR . style able . Range Seek Bar ) ĊĊĠĠĠ Ġdefault Color Ġ= Ġattributes ĊĠĠĠĠĠ Ġ. getColor ( R . style able . Range Seek Bar _ default Color , ĠContext Compat . getColor ( getContext (), ĠR . color . thumb Dark )) ĊĠĠĠ Ġactive Seek Bar Color Ġ= Ġattributes ĊĠĠĠĠĠ Ġ. getColor ( R . style able . Range Seek Bar _ active Seek Color , ĠContext Compat . getColor ( getContext (), ĠR . color . thumb Accent )) ĊĠĠĠ Ġdefault Seek Bar Color Ġ= Ġattributes ĊĠĠĠĠĠ Ġ. getColor ( R . style able . Range Seek Bar _ default Seek Color , ĠContext Compat . getColor ( getContext (), ĠR . color . seek Bar )) ĊĊĠĠĠ Ġval Ġdrawable Ġ= Ġattributes . get Drawable ( R . style able . Range Seek Bar _ thumb ) ĊĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Thumb Ġwas Ġnot Ġspecified . ĠSpecify Ġone Ġwith Ġ\" thumb \" Ġattribute ") ĊĊĠĠĠ Ġthumb Image Ġ= ĠBitmap ĊĠĠĠĠĠ Ġ. create Bitmap ( drawable . intrinsic Width , Ġdrawable . intrinsic Height , ĠBitmap . Config . ARGB _ 8 8 8 8 ) ĊĊĠĠĠ Ġval Ġcanvas Ġ= ĠCanvas ( thumb Image !! ) ĊĠĠĠ Ġdrawable . setBounds ( 0 , Ġ 0 , Ġcanvas . width , Ġcanvas . height ) ĊĠĠĠ Ġdrawable . draw ( canvas ) ĊĊĠĠĠ Ġval Ġthumb Width Ġ= Ġthumb Image !!. width . toFloat () ĊĊĠĠĠ Ġthumb Half Height Ġ= Ġ 0 . 5 f Ġ* Ġthumb Image !!. height ĊĠĠĠ Ġthumb Half Width Ġ= Ġ 0 . 5 f Ġ* Ġthumb Width ĊĊĠĠĠ Ġif Ġ( attrs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġset Range To Default Values () ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġa Ġ= ĠgetContext (). obtain Styled Attributes ( attrs , ĠR . style able . Range Seek Bar , Ġ 0 , Ġ 0 ) ĊĊĠĠĠĠĠ Ġset Range Values ( ĊĠĠĠĠĠĠĠ Ġextract Numeric Value From Attributes ( a , ĠR . style able . Range Seek Bar _ absolute MinValue , ĠDEFAULT _ MIN IMUM ), ĊĠĠĠĠĠĠĠ Ġextract Numeric Value From Attributes ( a , ĠR . style able . Range Seek Bar _ absolute MaxValue , ĠDEFAULT _ MAXIMUM )) ĊĊĠĠĠĠĠ Ġsingle Thumb Ġ= Ġa . getBoolean ( R . style able . Range Seek Bar _ single Thumb , Ġfalse ) ĊĊĠĠĠĠĠ Ġa . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠsetValue Prim And Number Type () ĊĊĠĠĠ Ġinitial Padding Ġ= ĠDimension Utils . dp To Px ( context , ĠINITIAL _ P ADDING _ IN _ DP ). toFloat () ĊĊĠĠĠ Ġtext Size Ġ= ĠDimension Utils . dp To Px ( context , ĠDEFAULT _ TEXT _ SIZE _ IN _ DP ) ĊĠĠĠ Ġdistance To Top Ġ= ĠDimension Utils . dp To Px ( context , ĠDEFAULT _ TEXT _ DISTANCE _ TO _ TOP _ IN _ DP ) ĊĠĠĠ Ġtext Offset Ġ= Ġthis . text Size Ġ+ ĠDimension Utils . dp To Px ( context , ĊĠĠĠĠĠ ĠDEFAULT _ TEXT _ DISTANCE _ TO _ BUTTON _ IN _ DP ĊĠĠĠ Ġ) Ġ+ Ġthis . distance To Top ĊĊĠĠĠ Ġval Ġline Height Ġ= ĠDimension Utils . dp To Px ( context , ĠLINE _ HEIGHT _ IN _ DP ). toFloat () ĊĊĠĠĠ Ġrect Ġ= ĠRect F ( padding , ĊĠĠĠĠĠ Ġtext Offset Ġ+ Ġthumb Half Height Ġ- Ġline Height Ġ/ Ġ 2 , ĊĠĠĠĠĠ Ġwidth Ġ- Ġpadding , ĊĠĠĠĠĠ Ġtext Offset . toFloat () Ġ+ Ġthumb Half Height Ġ+ Ġline Height Ġ/ Ġ 2 ) ĊĊĠĠĠ Ġ// Ġmake ĠRange Seek Bar Ġfocus able . ĠThis Ġsolves Ġfocus Ġhandling Ġissues Ġin Ġcase ĠEditText Ġwidgets Ġare Ġbeing Ġused Ġalong Ġwith Ġthe ĠRange Seek Bar Ġwithin ĠS coll Views . ĊĠĠĠ Ġis Focus able Ġ= Ġtrue ĊĠĠĠ Ġis Focus able In Touch Mode Ġ= Ġtrue ĊĠĠĠ Ġscaled Touch S lop Ġ= ĠView Configuration . get ( getContext ()). scaled Touch S lop ĊĊĠĠĠ Ġattributes . recycle () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġset Range Values ( min Value : ĠT , ĠmaxValue : ĠT ) Ġ{ ĊĠĠĠ Ġthis . absolute MinValue Ġ= Ġmin Value ĊĠĠĠ Ġthis . absolute MaxValue Ġ= ĠmaxValue ĊĠĠĠ ĠsetValue Prim And Number Type () ĊĠ Ġ} ĊĊĠ Ġprivate Ġ// Ġonly Ġused Ġto Ġset Ġdefault Ġvalues Ġwhen Ġinitial ised Ġfrom ĠXML Ġwithout Ġany Ġvalues Ġspecified ĊĠ Ġfun Ġset Range To Default Values () Ġ{ ĊĠĠĠ Ġthis . absolute MinValue Ġ= ĠDEFAULT _ MIN IMUM Ġas ĠT ĊĠĠĠ Ġthis . absolute MaxValue Ġ= ĠDEFAULT _ MAXIMUM Ġas ĠT ĊĠĠĠ ĠsetValue Prim And Number Type () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠsetValue Prim And Number Type () Ġ{ ĊĠĠĠ Ġabsolute MinValue Prim Ġ= Ġabsolute MinValue !!. toDouble () ĊĠĠĠ Ġabsolute MaxValue Prim Ġ= Ġabsolute MaxValue !!. toDouble () ĊĠĠĠ Ġnumber Type Ġ= ĠNumber Type . from Number ( absolute MinValue !! ) ĊĠ Ġ} ĊĊĠ Ġfun Ġreset Selected Values () Ġ{ ĊĠĠĠ Ġselected MinValue Ġ= Ġthis . absolute MinValue !! ĊĠĠĠ Ġselected MaxValue Ġ= Ġthis . absolute MaxValue !! ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRegisters Ġgiven Ġlistener Ġcallback Ġto Ġnotify Ġabout Ġchanged Ġselected Ġvalues . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġto Ġnotify Ġabout Ġchanged Ġselected Ġvalues . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġset On Range Seek Bar ChangeListener ( listener : ĠOn Range Seek Bar ChangeListener < T >) Ġ{ ĊĠĠĠ Ġthis . listener Ġ= Ġlistener ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠHandles Ġthumb Ġselection Ġand Ġmovement . ĠNot ifies Ġlistener Ġcallback Ġon Ġcertain Ġevents . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Touch Event ( event : ĠMotion Event ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġif Ġ(! isEnabled ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpointer Index : ĠInt ĊĊĠĠĠ Ġval Ġaction Ġ= Ġevent . action ĊĠĠĠ Ġwhen Ġ( action Ġand ĠMotion Event . ACTION _ MASK ) Ġ{ ĊĊĠĠĠĠĠ ĠMotion Event . ACTION _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemember Ġwhere Ġthe Ġmotion Ġevent Ġstarted ĊĠĠĠĠĠĠĠ Ġactive Pointer Id Ġ= Ġevent . get Pointer Id ( event . pointer Count Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġpointer Index Ġ= Ġevent . find Pointer Index ( active Pointer Id ) ĊĠĠĠĠĠĠĠ Ġdown Motion X Ġ= Ġevent . getX ( pointer Index ) ĊĊĠĠĠĠĠĠĠ Ġpressed Thumb Ġ= Ġeval Pressed Thumb ( down Motion X ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġhandle Ġthumb Ġp resses . ĊĠĠĠĠĠĠĠ Ġif Ġ( pressed Thumb Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ ĠonStart Tracking Touch () ĊĠĠĠĠĠĠĠ Ġtrack Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġattempt Claim Drag () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ MOVE Ġ-> Ġif Ġ( pressed Thumb Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtrack Touch Event ( event ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠScroll Ġto Ġfollow Ġthe Ġmotion Ġevent ĊĠĠĠĠĠĠĠĠĠ Ġpointer Index Ġ= Ġevent . find Pointer Index ( active Pointer Id ) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġevent . getX ( pointer Index ) ĊĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( Math . abs ( x Ġ- Ġdown Motion X ) Ġ> Ġscaled Touch S lop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonStart Tracking Touch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrack Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattempt Claim Drag () ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Notify While Dragging Ġ&& Ġlistener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener !!. on Range Seek Bar Values Changed ( this , Ġselected MinValue , Ġselected MaxValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġtrack Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠ Ġon Stop Tracking Touch () ĊĠĠĠĠĠĠĠĠĠ Ġset Pressed ( false ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTouch Ġup Ġwhen Ġwe Ġnever Ġcros sed Ġthe Ġtouch Ġs lop Ġthreshold ĊĠĠĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġinterpreted Ġas Ġa Ġtap - seek Ġto Ġthat Ġlocation . ĊĠĠĠĠĠĠĠĠĠ Ġperform Click () ĊĠĠĠĠĠĠĠĠĠ ĠonStart Tracking Touch () ĊĠĠĠĠĠĠĠĠĠ Ġtrack Touch Event ( event ) ĊĠĠĠĠĠĠĠĠĠ Ġon Stop Tracking Touch () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpressed Thumb Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠĠĠ Ġif Ġ( listener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlistener !!. on Range Seek Bar Values Changed ( this , Ġselected MinValue , Ġselected MaxValue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ DOWN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġevent . pointer Count Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġ// Ġfinal Ġint Ġindex Ġ= Ġev . getAction Index (); ĊĠĠĠĠĠĠĠ Ġdown Motion X Ġ= Ġevent . getX ( index ) ĊĠĠĠĠĠĠĠ Ġactive Pointer Id Ġ= Ġevent . get Pointer Id ( index ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ POINTER _ UP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġon Secondary Pointer Up ( event ) ĊĠĠĠĠĠĠĠ Ġinvalidate () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ ĠMotion Event . ACTION _ CANCEL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Dragging ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġon Stop Tracking Touch () ĊĠĠĠĠĠĠĠĠĠ Ġis Pressed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinvalidate () Ġ// Ġsee Ġabove Ġexplanation ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġperform Click (): ĠBoolean Ġ{ ĊĠĠĠ Ġsuper . perform Click () ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġon Secondary Pointer Up ( ev : ĠMotion Event ) Ġ{ ĊĠĠĠ Ġval Ġpointer Index Ġ= Ġev . action Ġand ĠACTION _ POINTER _ INDEX _ MASK Ġshr ĠACTION _ POINTER _ INDEX _ SHIFT ĊĊĠĠĠ Ġval Ġpointer Id Ġ= Ġev . get Pointer Id ( pointer Index ) ĊĠĠĠ Ġif Ġ( pointer Id Ġ== Ġactive Pointer Id ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġwas Ġour Ġactive Ġpointer Ġgoing Ġup . ĠChoose ĊĠĠĠĠĠ Ġ// Ġa Ġnew Ġactive Ġpointer Ġand Ġadjust Ġaccordingly . ĊĠĠĠĠĠ Ġ// ĠTODO : ĠMake Ġthis Ġdecision Ġmore Ġint elligent . ĊĠĠĠĠĠ Ġval Ġnew Pointer Index Ġ= Ġif Ġ( pointer Index Ġ== Ġ 0 ) Ġ 1 Ġelse Ġ 0 ĊĠĠĠĠĠ Ġdown Motion X Ġ= Ġev . getX ( new Pointer Index ) ĊĠĠĠĠĠ Ġactive Pointer Id Ġ= Ġev . get Pointer Id ( new Pointer Index ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġtrack Touch Event ( event : ĠMotion Event ) Ġ{ ĊĠĠĠ Ġval Ġpointer Index Ġ= Ġevent . find Pointer Index ( active Pointer Id ) ĊĠĠĠ Ġval Ġx Ġ= Ġevent . getX ( pointer Index ) ĊĊĠĠĠ Ġif Ġ( Thumb . MIN Ġ== Ġpressed Thumb Ġ&& Ġ! single Thumb ) Ġ{ ĊĠĠĠĠĠ Ġset Normalized MinValue ( screen To Normalized ( x )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( Thumb . MAX Ġ== Ġpressed Thumb ) Ġ{ ĊĠĠĠĠĠ Ġset Normalized MaxValue ( screen To Normalized ( x )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠT ries Ġto Ġclaim Ġthe Ġuser 's Ġdrag Ġmotion , Ġand Ġrequests Ġdis allow ing Ġany Ġan cestors Ġfrom Ġste aling Ġevents Ġin Ġthe Ġdrag . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġattempt Claim Drag () Ġ{ ĊĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġparent . request Dis allow Intercept Touch Event ( true ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThis Ġis Ġcalled Ġwhen Ġthe Ġuser Ġhas Ġstarted Ġtouch ing Ġthis Ġwidget . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠonStart Tracking Touch () Ġ{ ĊĠĠĠ Ġis Dragging Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThis Ġis Ġcalled Ġwhen Ġthe Ġuser Ġeither Ġreleases Ġhis Ġtouch Ġor Ġthe Ġtouch Ġis Ġcanceled . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġon Stop Tracking Touch () Ġ{ ĊĠĠĠ Ġis Dragging Ġ= Ġfalse ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠEns ures Ġcorrect Ġsize Ġof Ġthe Ġwidget . ĊĠĠ Ġ*/ ĊĠ Ġ@ Synchron ized ĊĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠ Ġvar Ġwidth Ġ= Ġ 2 0 0 ĊĠĠĠ Ġif Ġ( Measure Spec . UNSPECIFIED Ġ!= ĠMeasure Spec . get Mode ( width Measure Spec )) Ġ{ ĊĠĠĠĠĠ Ġwidth Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġheight Ġ= Ġthumb Image !!. height Ġ+ ĠDimension Utils . dp To Px ( context , ĠHEIGHT _ IN _ DP ) ĊĠĠĠ Ġif Ġ( Measure Spec . UNSPECIFIED Ġ!= ĠMeasure Spec . get Mode ( height Measure Spec )) Ġ{ ĊĠĠĠĠĠ Ġheight Ġ= ĠMath . min ( height , ĠMeasure Spec . getSize ( height Measure Spec )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġset Measured Dimension ( width , Ġheight ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDraw s Ġthe Ġwidget Ġon Ġthe Ġgiven Ġcanvas . ĊĠĠ Ġ*/ ĊĠ Ġ@ Synchron ized ĊĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠ Ġpaint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠ Ġpaint . style Ġ= ĠStyle . FILL ĊĠĠĠ Ġpaint . color Ġ= Ġdefault Seek Bar Color ĊĠĠĠ Ġpaint . is Anti Alias Ġ= Ġtrue ĊĊĠĠĠ Ġ// Ġdraw Ġmin Ġand Ġmax Ġlabels ĊĠĠĠ Ġval Ġmin Label Ġ= Ġ"" ĊĠĠĠ Ġval Ġmax Label Ġ= Ġ"" ĊĊĠĠĠ Ġval Ġmin Max Label Size Ġ= ĠMath . max ( paint . measure Text ( min Label ), Ġpaint . measure Text ( max Label )) ĊĠĠĠ Ġval Ġmin Max Height Ġ= Ġtext Offset . toFloat () Ġ+ Ġthumb Half Height Ġ+ Ġ( text Size Ġ/ Ġ 3 ). toFloat () ĊĠĠĠ Ġcanvas . draw Text ( min Label , Ġ 0 f , Ġmin Max Height , Ġpaint ) ĊĠĠĠ Ġcanvas . draw Text ( max Label , Ġwidth Ġ- Ġmin Max Label Size , Ġmin Max Height , Ġpaint ) ĊĠĠĠ Ġpadding Ġ= Ġinitial Padding Ġ+ Ġmin Max Label Size Ġ+ Ġthumb Half Width ĊĊĠĠĠ Ġ// Ġdraw Ġseek Ġbar Ġbackground Ġline ĊĠĠĠ Ġrect !!. left Ġ= Ġpadding ĊĠĠĠ Ġrect !!. right Ġ= Ġwidth Ġ- Ġpadding ĊĠĠĠ Ġcanvas . draw Rect ( rect !! , Ġpaint ) ĊĊĠĠĠ Ġval Ġselected Values Are Default Ġ= ĊĠĠĠĠĠ Ġselected MinValue Ġ== Ġabsolute MinValue Ġ&& Ġselected MaxValue Ġ== Ġabsolute MaxValue ĊĊĠĠĠ Ġval Ġcolor ToUse For Buttons And Highlight ed Line Ġ= Ġif Ġ( selected Values Are Default ) ĊĠĠĠĠĠ Ġdefault Seek Bar Color ĊĠĠĠ Ġelse ĊĠĠĠ Ġ// Ġdefault Ġvalues ĊĠĠĠĠĠ Ġactive Seek Bar Color Ġ// Ġnon Ġdefault , Ġfilter Ġis Ġactive ĊĊĠĠĠ Ġ// Ġdraw Ġseek Ġbar Ġactive Ġrange Ġline ĊĠĠĠ Ġrect !!. left Ġ= Ġnormalized To Screen ( normalized MinValue ) ĊĠĠĠ Ġrect !!. right Ġ= Ġnormalized To Screen ( normalized MaxValue ) ĊĊĠĠĠ Ġpaint . color Ġ= Ġcolor ToUse For Buttons And Highlight ed Line ĊĠĠĠ Ġcanvas . draw Rect ( rect !! , Ġpaint ) ĊĊĠĠĠ Ġ// Ġdraw Ġminimum Ġthumb Ġif Ġnot Ġa Ġsingle Ġthumb Ġcontrol ĊĠĠĠ Ġif Ġ(! single Thumb ) Ġ{ ĊĠĠĠĠĠ Ġdraw Thumb ( normalized To Screen ( normalized MinValue ), ĠThumb . MIN Ġ== Ġpressed Thumb , Ġcanvas ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġdraw Ġmaximum Ġthumb ĊĠĠĠ Ġdraw Thumb ( normalized To Screen ( normalized MaxValue ), ĠThumb . MAX Ġ== Ġpressed Thumb , Ġcanvas ) ĊĊĠĠĠ Ġ// Ġdraw Ġthe Ġtext Ġif Ġsl iders Ġhave Ġmoved Ġfrom Ġdefault Ġedges ĊĠĠĠ Ġif Ġ(! selected Values Are Default ) Ġ{ ĊĠĠĠĠĠ Ġpaint . text Size Ġ= Ġtext Size . toFloat () ĊĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠ Ġ// Ġgive Ġtext Ġa Ġbit Ġmore Ġspace Ġhere Ġso Ġit Ġdoesn 't Ġget Settings Ġcut Ġoff ĊĠĠĠĠĠ Ġval Ġoffset Ġ= ĠDimension Utils . dp To Px ( context , ĠTEXT _ L ATER AL _ P ADDING _ IN _ DP ) ĊĊĠĠĠĠĠ Ġval Ġmin Text Ġ= Ġselected MinValue . toString () ĊĠĠĠĠĠ Ġval Ġmax Text Ġ= Ġselected MaxValue . toString () ĊĠĠĠĠĠ Ġval Ġmin Text Width Ġ= Ġpaint . measure Text ( min Text ) Ġ+ Ġoffset ĊĠĠĠĠĠ Ġval Ġmax Text Width Ġ= Ġpaint . measure Text ( max Text ) Ġ+ Ġoffset ĊĊĠĠĠĠĠ Ġif Ġ(! single Thumb ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcanvas . draw Text ( min Text , ĊĠĠĠĠĠĠĠĠĠ Ġnormalized To Screen ( normalized MinValue ) Ġ- Ġmin Text Width Ġ* Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠĠĠ Ġ( distance To Top Ġ+ Ġtext Size ). toFloat (), ĊĠĠĠĠĠĠĠĠĠ Ġpaint ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcanvas . draw Text ( max Text , ĊĠĠĠĠĠĠĠ Ġnormalized To Screen ( normalized MaxValue ) Ġ- Ġmax Text Width Ġ* Ġ 0 . 5 f , ĊĠĠĠĠĠĠĠ Ġ( distance To Top Ġ+ Ġtext Size ). toFloat (), ĊĠĠĠĠĠĠĠ Ġpaint ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠOver ridden Ġto Ġsave Ġinstance Ġstate Ġwhen Ġdevice Ġorientation Ġchanges . ĠThis Ġmethod Ġis Ġcalled Ġautomatically Ġif Ġyou Ġassign Ġan Ġid Ġto Ġthe ĠRange Seek Bar Ġwidget Ġusing Ġthe Ġ[. setId ] Ġmethod . ĠOther Ġmembers Ġof Ġthis Ġclass Ġthan Ġthe Ġnormalized Ġmin Ġand Ġmax Ġvalues Ġdon 't Ġneed Ġto Ġbe Ġsaved . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ{ ĊĠĠĠ Ġval Ġbundle Ġ= ĠBundle () ĊĠĠĠ Ġbundle . put Parcelable (" SUPER ", Ġsuper . on Save InstanceState ()) ĊĠĠĠ Ġbundle . put Double (" MIN ", Ġnormalized MinValue ) ĊĠĠĠ Ġbundle . put Double (" MAX ", Ġnormalized MaxValue ) ĊĠĠĠ Ġreturn Ġbundle ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠOver ridden Ġto Ġrestore Ġinstance Ġstate Ġwhen Ġdevice Ġorientation Ġchanges . ĠThis Ġmethod Ġis Ġcalled Ġautomatically Ġif Ġyou Ġassign Ġan Ġid Ġto Ġthe ĠRange Seek Bar Ġwidget Ġusing Ġthe Ġ[. setId ] Ġmethod . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Restore InstanceState ( parcel : ĠParcel able ) Ġ{ ĊĠĠĠ Ġval Ġbundle Ġ= Ġparcel Ġas ĠBundle ĊĠĠĠ Ġsuper . on Restore InstanceState ( bundle . get Parcelable (" SUPER ")) ĊĠĠĠ Ġnormalized MinValue Ġ= Ġbundle . getDouble (" MIN ") ĊĠĠĠ Ġnormalized MaxValue Ġ= Ġbundle . getDouble (" MAX ") ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDraw s Ġthe Ġ" normal " Ġresp . Ġ" pressed " Ġthumb Ġimage Ġon Ġspecified Ġx - coordinate . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġscreen Coord ĠThe Ġx - coordinate Ġin Ġscreen Ġspace Ġwhere Ġto Ġdraw Ġthe Ġimage . ĊĠĠ Ġ* Ġ@ param Ġpressed ĠIs Ġthe Ġthumb Ġcurrently Ġin Ġ" pressed " Ġstate ? ĊĠĠ Ġ* Ġ@ param Ġcanvas ĠThe Ġcanvas Ġto Ġdraw Ġupon . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġdraw Thumb ( screen Coord : ĠFloat , Ġpressed : ĠBoolean , Ġcanvas : ĠCanvas ) Ġ{ ĊĠĠĠ Ġcanvas . draw Bitmap ( thumb Image !! , Ġscreen Coord Ġ- Ġthumb Half Width , ĊĠĠĠĠĠ Ġtext Offset . toFloat (), ĊĠĠĠĠĠ Ġpaint ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDec ides Ġwhich Ġ( if Ġany ) Ġthumb Ġis Ġtouched Ġby Ġthe Ġgiven Ġx - coordinate . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtouch X ĠThe Ġx - coordinate Ġof Ġa Ġtouch Ġevent Ġin Ġscreen Ġspace . ĊĠĠ Ġ* Ġ@ return ĠThe Ġpressed Ġthumb Ġor Ġnull Ġif Ġnone Ġhas Ġbeen Ġtouched . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġeval Pressed Thumb ( touch X : ĠFloat ): ĠThumb ? Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠThumb ? Ġ= Ġnull ĊĠĠĠ Ġval Ġmin Thumb Pressed Ġ= ĠisIn Thumb Range ( touch X , Ġnormalized MinValue ) ĊĠĠĠ Ġval Ġmax Thumb Pressed Ġ= ĠisIn Thumb Range ( touch X , Ġnormalized MaxValue ) ĊĠĠĠ Ġif Ġ( min Thumb Pressed Ġ&& Ġmax Thumb Pressed ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġif Ġboth Ġthumb s Ġare Ġpressed Ġ( they Ġlie Ġon Ġtop Ġof Ġeach Ġother ), Ġchoose Ġthe Ġone Ġwith Ġmore Ġroom Ġto Ġdrag . Ġthis Ġavoids Ġ" stall ing " Ġthe Ġthumb s Ġin Ġa Ġcorner , Ġnot Ġbeing Ġable Ġto Ġdrag Ġthem Ġapart Ġanymore . ĊĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( touch X Ġ/ Ġwidth Ġ> Ġ 0 . 5 f ) ĠThumb . MIN Ġelse ĠThumb . MAX ĊĠĠĠ Ġ} Ġelse Ġif Ġ( min Thumb Pressed ) Ġ{ ĊĠĠĠĠĠ Ġresult Ġ= ĠThumb . MIN ĊĠĠĠ Ġ} Ġelse Ġif Ġ( max Thumb Pressed ) Ġ{ ĊĠĠĠĠĠ Ġresult Ġ= ĠThumb . MAX ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠDec ides Ġif Ġgiven Ġx - coordinate Ġin Ġscreen Ġspace Ġneeds Ġto Ġbe Ġinterpreted Ġas Ġ" within " Ġthe Ġnormalized Ġthumb Ġx - coordinate . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtouch X ĠThe Ġx - coordinate Ġin Ġscreen Ġspace Ġto Ġcheck . ĊĠĠ Ġ* Ġ@ param Ġnormalized Thumb Value ĠThe Ġnormalized Ġx - coordinate Ġof Ġthe Ġthumb Ġto Ġcheck . ĊĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġx - coordinate Ġis Ġin Ġthumb Ġrange , Ġfalse Ġotherwise . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠisIn Thumb Range ( touch X : ĠFloat , Ġnormalized Thumb Value : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn ĠMath . abs ( touch X Ġ- Ġnormalized To Screen ( normalized Thumb Value )) Ġ<= Ġthumb Half Width ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġnormalized Ġmin Ġvalue Ġto Ġvalue Ġso Ġthat Ġ 0 Ġ<= Ġvalue Ġ<= Ġnormalized Ġmax Ġvalue Ġ<= Ġ 1 . ĠThe ĠView Ġwill Ġget Settings Ġinvalid ated Ġwhen Ġcalling Ġthis Ġmethod . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġnew Ġnormalized Ġmin Ġvalue Ġto Ġset . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġset Normalized MinValue ( value : ĠDouble ) Ġ{ ĊĠĠĠ Ġnormalized MinValue Ġ= ĠMath . max ( 0 . 0 , ĠMath . min ( 1 . 0 , ĠMath . min ( value , Ġnormalized MaxValue ))) ĊĠĠĠ Ġinvalidate () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġnormalized Ġmax Ġvalue Ġto Ġvalue Ġso Ġthat Ġ 0 Ġ<= Ġnormalized Ġmin Ġvalue Ġ<= Ġvalue Ġ<= Ġ 1 . ĠThe ĠView Ġwill Ġget Settings Ġinvalid ated Ġwhen Ġcalling Ġthis Ġmethod . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġvalue ĠThe Ġnew Ġnormalized Ġmax Ġvalue Ġto Ġset . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġset Normalized MaxValue ( value : ĠDouble ) Ġ{ ĊĠĠĠ Ġnormalized MaxValue Ġ= ĠMath . max ( 0 . 0 , ĠMath . min ( 1 . 0 , ĠMath . max ( value , Ġnormalized MinValue ))) ĊĠĠĠ Ġinvalidate () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConverts Ġa Ġnormalized Ġvalue Ġto Ġa ĠNumber Ġobject Ġin Ġthe Ġvalue Ġspace Ġbetween Ġabsolute Ġminimum Ġand Ġmaximum . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġnormalized Ġdouble Ġvalue ĊĠĠ Ġ* Ġ@ return ĠT ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġnormalized To Value ( normalized : ĠDouble ): ĠT Ġ{ ĊĠĠĠ Ġval Ġv Ġ= Ġabsolute MinValue Prim Ġ+ Ġnormalized Ġ* Ġ( absolute MaxValue Prim Ġ- Ġabsolute MinValue Prim ) ĊĠĠĠ Ġ// ĠTODO Ġparameter ize Ġthis Ġrounding Ġto Ġallow Ġvariable Ġdecimal Ġpoints ĊĠĠĠ Ġreturn Ġnumber Type !!. to Number ( Math . round ( v Ġ* Ġ 1 0 0 ) Ġ/ Ġ 1 0 0 . 0 ) Ġas ĠT ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConverts Ġthe Ġgiven ĠNumber Ġvalue Ġto Ġa Ġnormalized Ġdouble . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġvalue ĠThe ĠNumber Ġvalue Ġto Ġnormalize . ĊĠĠ Ġ* Ġ@ return ĠThe Ġnormalized Ġdouble . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġvalue To Normalized ( value : ĠT ): ĠDouble Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( 0 . 0 Ġ== Ġabsolute MaxValue Prim Ġ- Ġabsolute MinValue Prim ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġprevent Ġdivision Ġby Ġzero , Ġsimply Ġreturn Ġ 0 . ĊĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ} Ġelse Ġ( value . toDouble () Ġ- Ġabsolute MinValue Prim ) Ġ/ Ġ( absolute MaxValue Prim Ġ- Ġabsolute MinValue Prim ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConverts Ġa Ġnormalized Ġvalue Ġinto Ġscreen Ġspace . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġnormalized Coord ĠThe Ġnormalized Ġvalue Ġto Ġconvert . ĊĠĠ Ġ* Ġ@ return ĠThe Ġconverted Ġvalue Ġin Ġscreen Ġspace . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġnormalized To Screen ( normalized Coord : ĠDouble ): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġ( padding Ġ+ Ġnormalized Coord Ġ* Ġ( width Ġ- Ġ 2 Ġ* Ġpadding )). toFloat () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConverts Ġscreen Ġspace Ġx - coordinates Ġinto Ġnormalized Ġvalues . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġscreen Coord ĠThe Ġx - coordinate Ġin Ġscreen Ġspace Ġto Ġconvert . ĊĠĠ Ġ* Ġ@ return ĠThe Ġnormalized Ġvalue . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġscreen To Normalized ( screen Coord : ĠFloat ): ĠDouble Ġ{ ĊĠĠĠ Ġval Ġwidth Ġ= Ġwidth ĊĠĠĠ Ġreturn Ġif Ġ( width Ġ<= Ġ 2 Ġ* Ġpadding ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġprevent Ġdivision Ġby Ġzero , Ġsimply Ġreturn Ġ 0 . ĊĠĠĠĠĠĠ 0 . 0 ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= Ġ(( screen Coord Ġ- Ġpadding ) Ġ/ Ġ( width Ġ- Ġ 2 Ġ* Ġpadding )). toDouble () ĊĠĠĠĠĠ ĠMath . min ( 1 . 0 , ĠMath . max ( 0 . 0 , Ġresult )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThumb Ġconstants Ġ( min Ġand Ġmax ). ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġenum Ġclass ĠThumb Ġ{ ĊĊĠĠĠ ĠMIN , ĠMAX ĊĠ Ġ} ĊĊĠ Ġprivate Ġenum Ġclass ĠNumber Type Ġ{ ĊĊĠĠĠ ĠLONG , ĠDOUBLE , ĠINTEGER , ĠFLOAT , ĠSH ORT , ĠBYTE , ĠBIG _ DECIMAL ; ĊĊĠĠĠ Ġfun Ġto Number ( value : ĠDouble ): ĠNumber Ġ{ ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLONG Ġ-> Ġvalue . to Long () ĊĠĠĠĠĠĠĠ ĠDOUBLE Ġ-> Ġvalue ĊĠĠĠĠĠĠĠ ĠINTEGER Ġ-> Ġvalue . toInt () ĊĠĠĠĠĠĠĠ ĠFLOAT Ġ-> Ġvalue . toFloat () ĊĠĠĠĠĠĠĠ ĠSH ORT Ġ-> Ġvalue . to Short () ĊĠĠĠĠĠĠĠ ĠBYTE Ġ-> Ġvalue . to Byte () ĊĠĠĠĠĠĠĠ ĠBIG _ DECIMAL Ġ-> ĠBigDecimal . valueOf ( value ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠĠĠ Ġfun Ġ< E Ġ: ĠNumber > Ġfrom Number ( value : ĠE ): ĠNumber Type Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠLONG ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠDouble ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠDOUBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠINTEGER ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠFLOAT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠShort ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠSH ORT ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠByte ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠBYTE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( value Ġis ĠBigDecimal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠBIG _ DECIMAL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Number Ġclass Ġ'" Ġ+ Ġvalue . java Class . name Ġ+ Ġ"' Ġis Ġnot Ġsupported ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinterface ĠOn Range Seek Bar ChangeListener < T > Ġ{ ĊĊĠĠĠ Ġfun Ġon Range Seek Bar Values Changed ( bar : ĠRange Seek Bar <* >, Ġmin Value : ĠT , ĠmaxValue : ĠT ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠDEFAULT _ MIN IMUM Ġ= Ġ 0 ĊĠĠĠ Ġconst Ġval ĠDEFAULT _ MAXIMUM Ġ= Ġ 1 0 0 ĊĠĠĠ Ġconst Ġval ĠHEIGHT _ IN _ DP Ġ= Ġ 3 0 ĊĠĠĠ Ġconst Ġval ĠTEXT _ L ATER AL _ P ADDING _ IN _ DP Ġ= Ġ 3 ĊĠĠĠ Ġconst Ġval ĠINVALID _ POINTER _ ID Ġ= Ġ 2 5 5 ĊĊĠĠĠ Ġ// ĠLocal ized Ġconstants Ġfrom ĠMotion Event Ġfor Ġcompatibility ĊĠĠĠ Ġ// Ġwith ĠAPI Ġ< Ġ 8 Ġ" F roy o ". ĊĠĠĠ Ġconst Ġval ĠACTION _ POINTER _ INDEX _ MASK Ġ= Ġ 0 x 0 0 0 0 ff 0 0 ĊĠĠĠ Ġconst Ġval ĠACTION _ POINTER _ INDEX _ SHIFT Ġ= Ġ 8 ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠINITIAL _ P ADDING _ IN _ DP Ġ= Ġ 8 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TEXT _ SIZE _ IN _ DP Ġ= Ġ 9 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TEXT _ DISTANCE _ TO _ BUTTON _ IN _ DP Ġ= Ġ 8 ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TEXT _ DISTANCE _ TO _ TOP _ IN _ DP Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠLINE _ HEIGHT _ IN _ DP Ġ= Ġ 2 ĊĠ Ġ} Ċ } Ċ