package Ġcom . t ams ire e . rx ui . view . ticker Ċ Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . Paint Ċ Ċ /** Ċ Ġ* Ġ@ author Ġt ams ire e Ċ Ġ* ĠRepresents Ġa Ġcolumn Ġof Ġcharacters Ġto Ġbe Ġdrawn Ġon Ġthe Ġscreen . ĠThis Ġclass Ġprimarily Ġhandles Ċ Ġ* Ġanim ating Ġwithin Ġthe Ġcolumn Ġfrom Ġone Ġcharacter Ġto Ġthe Ġnext Ġand Ġdrawing Ġall Ġof Ġthe Ġintermediate Ċ Ġ* Ġstates . Ċ Ġ*/ Ċ internal Ġclass ĠRx Ticker Column ( private Ġval Ġcharacter List : ĠChar Array , Ġprivate Ġval Ġcharacter Indices Map : ĠMap < Char , ĠInt >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmetrics : ĠRx Ticker Draw Metrics ) Ġ{ ĊĠĠĠ Ġvar Ġcurrent Char Ġ= ĠRx Ticker Utils . EMPTY _ CHAR ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġtarget Char Ġ= ĠRx Ticker Utils . EMPTY _ CHAR ĊĊĠĠĠ Ġ// ĠThe Ġindices Ġcharacters Ġsimply Ġsign ify Ġwhat Ġpositions Ġare Ġfor Ġthe Ġcurrent Ġand Ġtarget ĊĠĠĠ Ġ// Ġcharacters Ġin Ġthe Ġassigned Ġcharacter List . ĠThis Ġtells Ġus Ġhow Ġto Ġanimate Ġfrom Ġthe Ġcurrent ĊĠĠĠ Ġ// Ġto Ġthe Ġtarget Ġcharacters . ĊĠĠĠ Ġprivate Ġvar ĠstartIndex Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġend Index Ġ= Ġ 0 ĊĊĠĠĠ Ġ// ĠDraw ing Ġstate Ġvariables Ġthat Ġget Ġupdated Ġwhenever Ġanimation Ġprogress Ġgets Ġupdated . ĊĠĠĠ Ġprivate Ġvar Ġbottom Char Index Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbottom Delta Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġchar Height Ġ= Ġ 0 f ĊĊĠĠĠ Ġ// ĠDraw ing Ġstate Ġvariables Ġfor Ġhandling Ġsize Ġtransition ĊĠĠĠ Ġprivate Ġvar Ġsource Width Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġcurrent Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġprivate Ġvar Ġtarget Width Ġ= Ġ 0 f ĊĠĠĠ Ġvar Ġminimum Required Width Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ// ĠThe Ġbottom Ġdelta Ġvariables Ġsign ifies Ġthe Ġvertical Ġoffset Ġthat Ġthe Ġbottom Ġdrawn Ġcharacter ĊĠĠĠ Ġ// Ġis Ġseeing . ĠIf Ġthe Ġdelta Ġis Ġ 0 , Ġit Ġmeans Ġthat Ġthe Ġcharacter Ġis Ġperfectly Ġcentered . ĠIf Ġthe ĊĠĠĠ Ġ// Ġdelta Ġis Ġnegative , Ġit Ġmeans Ġthat Ġthe Ġbottom Ġcharacter Ġis Ġpok ing Ġout Ġfrom Ġthe Ġbottom Ġand ĊĠĠĠ Ġ// Ġpart Ġof Ġthe Ġtop Ġcharacter Ġis Ġvisible . ĠThe Ġdelta Ġshould Ġnever Ġbe Ġpositive Ġbecause Ġit Ġmeans ĊĠĠĠ Ġ// Ġthat Ġthe Ġbottom Ġcharacter Ġis Ġnot Ġactually Ġthe Ġbottom Ġcharacter . ĊĠĠĠ Ġprivate Ġvar Ġcurrent Bottom Delta Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġprevious Bottom Delta Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġdirection Adjustment Ġ= Ġ 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġthe Ġcolumn Ġthat Ġthe Ġnext Ġcharacter Ġit Ġshould Ġshow Ġis Ġ{@ param Ġtarget Char }. ĠThis Ġcan ĊĠĠĠĠ Ġ* Ġchange Ġcan Ġeither Ġbe Ġanimated Ġor Ġinstant Ġdepending Ġon Ġthe Ġanimation Ġprogress Ġset Ġby ĊĠĠĠĠ Ġ* Ġ[. set Animation Progress ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Target Char ( target Char : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSet Ġthe Ġcurrent Ġand Ġtarget Ġcharacters Ġfor Ġthe Ġanimation ĊĠĠĠĠĠĠĠ Ġthis . target Char Ġ= Ġtarget Char ĊĠĠĠĠĠĠĠ Ġsource Width Ġ= Ġcurrent Width ĊĠĠĠĠĠĠĠ Ġtarget Width Ġ= Ġmetrics . get Char Width ( target Char ) ĊĠĠĠĠĠĠĠ Ġminimum Required Width Ġ= ĠMath . max ( source Width , Ġtarget Width ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalculate Ġthe Ġcurrent Ġindices ĊĠĠĠĠĠĠĠ Ġset Character Indices () ĊĠĠĠĠĠĠĠ Ġval Ġscroll Down Ġ= Ġend Index Ġ>= ĠstartIndex ĊĠĠĠĠĠĠĠ Ġdirection Adjustment Ġ= Ġif Ġ( scroll Down ) Ġ 1 Ġelse Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġcurrent Bottom Delta Ġas Ġprevious Bottom Delta Ġin Ġcase Ġthis Ġcall Ġto Ġset Target Char ĊĠĠĠĠĠĠĠ Ġ// Ġinterrupted Ġa Ġpreviously Ġrunning Ġanimation . ĠThe Ġdelt as Ġwill Ġthen Ġbe Ġused Ġto Ġcompute ĊĠĠĠĠĠĠĠ Ġ// Ġoffset Ġso Ġthat Ġthe Ġinter ruption Ġfeels Ġsmooth Ġon Ġthe ĠUI . ĊĠĠĠĠĠĠĠ Ġprevious Bottom Delta Ġ= Ġcurrent Bottom Delta ĊĠĠĠĠĠĠĠ Ġcurrent Bottom Delta Ġ= Ġ 0 f ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Target Char (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget Char ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhelper Ġmethod Ġfor Ġpop ulating Ġ[. startIndex ] Ġand Ġ[. end Index ] Ġgiven Ġthe ĊĠĠĠĠ Ġ* Ġcurrent Ġand Ġtarget Ġcharacters Ġfor Ġthe Ġanimation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset Character Indices () Ġ{ ĊĠĠĠĠĠĠĠ ĠstartIndex Ġ= Ġ( if Ġ( character Indices Map . containsKey ( current Char )) Ġcharacter Indices Map [ current Char ] Ġelse ĠUNKNOWN _ START _ INDEX ) !! ĊĠĠĠĠĠĠĠ Ġend Index Ġ= Ġ( if Ġ( character Indices Map . containsKey ( target Char )) Ġcharacter Indices Map [ target Char ] Ġelse ĠUNKNOWN _ END _ INDEX ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Animation End () Ġ{ ĊĠĠĠĠĠĠĠ Ġminimum Required Width Ġ= Ġcurrent Width ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Animation Progress ( animation Progress : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( animation Progress Ġ== Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAnimation Ġfinished Ġ( or Ġnever Ġstarted ), Ġset Ġto Ġstable Ġstate . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Char Ġ= Ġtarget Char ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bottom Delta Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprevious Bottom Delta Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġchar Height Ġ= Ġmetrics . char Height ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġlet 's Ġfind Ġthe Ġtotal Ġheight Ġof Ġthis Ġcolumn Ġbetween Ġthe Ġstart Ġand Ġend Ġchars . ĊĠĠĠĠĠĠĠ Ġval Ġtotal Height Ġ= Ġchar Height Ġ* ĠMath . abs ( end Index Ġ- ĠstartIndex ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcurrent Ġbase Ġis Ġthen Ġthe Ġpart Ġof Ġthe Ġtotal Ġheight Ġthat Ġwe Ġhave Ġprog ressed Ġto ĊĠĠĠĠĠĠĠ Ġ// Ġfrom Ġthe Ġanimation . ĠFor Ġexample , Ġthere Ġmight Ġbe Ġ 5 Ġcharacters , Ġeach Ġcharacter Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġ 2 px Ġt all , Ġso Ġthe Ġtotal Height Ġis Ġ 1 0 . ĠIf Ġwe Ġare Ġat Ġ 5 0 % Ġprogress , Ġthen Ġour Ġbaseline ĊĠĠĠĠĠĠĠ Ġ// Ġin Ġthis Ġcolumn Ġis Ġat Ġ 5 Ġout Ġof Ġ 1 0 Ġ( which Ġis Ġthe Ġ 3 rd Ġcharacter Ġwith Ġa Ġ- 5 0 % Ġoffset ĊĠĠĠĠĠĠĠ Ġ// Ġto Ġthe Ġbaseline ). ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Base Ġ= Ġanimation Progress Ġ* Ġtotal Height ĊĊĠĠĠĠĠĠĠ Ġ// ĠGiven Ġthe Ġcurrent Ġbase , Ġwe Ġnow Ġcan Ġfind Ġwhich Ġcharacter Ġshould Ġdrawn Ġon Ġthe Ġbottom . ĊĠĠĠĠĠĠĠ Ġ// ĠNote Ġthat Ġthis Ġposition Ġis Ġa Ġfloat . ĠFor Ġexample , Ġif Ġthe Ġbottom Char Position Ġis ĊĠĠĠĠĠĠĠ Ġ// Ġ 4 . 5 , Ġit Ġmeans Ġthat Ġthe Ġbottom Ġcharacter Ġis Ġthe Ġ 4 th Ġcharacter , Ġand Ġit Ġhas Ġa Ġ- 5 0 % ĊĠĠĠĠĠĠĠ Ġ// Ġoffset Ġrelative Ġto Ġthe Ġbaseline . ĊĠĠĠĠĠĠĠ Ġval Ġbottom Char Position Ġ= Ġcurrent Base Ġ/ Ġchar Height ĊĊĠĠĠĠĠĠĠ Ġ// ĠBy Ġsubtract ing Ġaway Ġthe Ġinteger Ġpart Ġof Ġbottom Char Position , Ġwe Ġnow Ġhave Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġpercentage Ġrepresentation Ġof Ġthe Ġbottom Ġchar 's Ġoffset . ĊĠĠĠĠĠĠĠ Ġval Ġbottom Char Offset Percentage Ġ= Ġbottom Char Position Ġ- Ġbottom Char Position . toInt () ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġmight Ġhave Ġinterrupted Ġa Ġprevious Ġanimation Ġif Ġprevious Bottom Delta Ġis Ġnot Ġ 0 f . ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthat 's Ġthe Ġcase , Ġwe Ġneed Ġto Ġtake Ġthis Ġdelta Ġinto Ġaccount Ġso Ġthat Ġthe Ġprevious ĊĠĠĠĠĠĠĠ Ġ// Ġcharacter Ġoffset Ġwon 't Ġbe Ġw ip ed Ġaway Ġwhen Ġwe Ġstart Ġa Ġnew Ġanimation . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġmultiply Ġby Ġthe Ġinverse Ġpercentage Ġso Ġthat Ġthe Ġoffset Ġcontribution Ġfrom Ġthe Ġdelta ĊĠĠĠĠĠĠĠ Ġ// Ġprog resses Ġalong Ġwith Ġthe Ġrest Ġof Ġthe Ġanimation Ġ( from Ġfull Ġdelta Ġto Ġ 0 ). ĊĠĠĠĠĠĠĠ Ġval Ġadditional Delta Ġ= Ġprevious Bottom Delta Ġ* Ġ( 1 f Ġ- Ġanimation Progress ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow , Ġusing Ġthe Ġbottom Ġchar 's Ġoffset Ġpercentage Ġand Ġthe Ġdelta Ġwe Ġhave Ġfrom Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġprevious Ġanimation , Ġwe Ġcan Ġnow Ġcompute Ġwhat 's Ġthe Ġactual Ġoffset Ġof Ġthe Ġbottom ĊĠĠĠĠĠĠĠ Ġ// Ġcharacter Ġin Ġthe Ġcolumn Ġrelative Ġto Ġthe Ġbaseline . ĊĠĠĠĠĠĠĠ Ġbottom Delta Ġ= Ġ( bottom Char Offset Percentage Ġ* Ġchar Height Ġ* Ġdirection Adjustment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġadditional Delta ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFigure Ġout Ġwhat Ġthe Ġactual Ġcharacter Ġindex Ġis Ġin Ġthe Ġcharacter List , Ġand Ġthen ĊĠĠĠĠĠĠĠ Ġ// Ġdraw Ġthe Ġcharacter Ġwith Ġthe Ġcomputed Ġoffset . ĊĠĠĠĠĠĠĠ Ġbottom Char Index Ġ= ĠstartIndex Ġ+ Ġbottom Char Position . toInt () Ġ* Ġdirection Adjustment ĊĠĠĠĠĠĠĠ Ġthis . char Height Ġ= Ġchar Height ĊĠĠĠĠĠĠĠ Ġcurrent Width Ġ= Ġsource Width Ġ+ Ġ( target Width Ġ- Ġsource Width ) Ġ* Ġanimation Progress ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDraw Ġthe Ġcurrent Ġstate Ġof Ġthe Ġcolumn Ġas Ġit 's Ġanim ating Ġfrom Ġone Ġcharacter Ġin Ġthe Ġlist ĊĠĠĠĠ Ġ* Ġto Ġanother . ĠThis Ġmethod Ġwill Ġtake Ġinto Ġaccount Ġvarious Ġfactors Ġsuch Ġas Ġanimation ĊĠĠĠĠ Ġ* Ġprogress Ġand Ġthe Ġpreviously Ġinterrupted Ġanimation Ġstate Ġto Ġrender Ġthe Ġcharacters ĊĠĠĠĠ Ġ* Ġin Ġthe Ġcorrect Ġposition Ġon Ġthe Ġcanvas . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdraw ( canvas : ĠCanvas , Ġtext Paint : ĠPaint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( draw Text ( canvas , Ġtext Paint , Ġcharacter List , Ġbottom Char Index , Ġbottom Delta )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSave Ġthe Ġcurrent Ġdrawing Ġstate Ġin Ġcase Ġour Ġanimation Ġgets Ġinterrupted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bottom Char Index Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Char Ġ= Ġcharacter List [ bottom Char Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( bottom Char Index Ġ== ĠUNKNOWN _ END _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Char Ġ= Ġtarget Char ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Bottom Delta Ġ= Ġbottom Delta ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġthe Ġcorresponding Ġtop Ġand Ġbottom Ġcharacters Ġif Ġapplicable ĊĠĠĠĠĠĠĠ Ġdraw Text ( canvas , Ġtext Paint , Ġcharacter List , Ġbottom Char Index Ġ+ Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Delta Ġ- Ġchar Height ) ĊĠĠĠĠĠĠĠ Ġ// ĠDraw ing Ġthe Ġbottom Ġcharacter Ġhere Ġmight Ġseem Ġcounter - int u itive Ġbecause Ġwe 've Ġbeen ĊĠĠĠĠĠĠĠ Ġ// Ġcomputing Ġfor Ġthe Ġbottom Ġcharacter Ġthis Ġentire Ġtime . ĠBut Ġthe Ġbottom Ġcharacter ĊĠĠĠĠĠĠĠ Ġ// Ġcomputed Ġabove Ġmight Ġactually Ġbe Ġabove Ġthe Ġbaseline Ġif Ġwe Ġinterrupted Ġa Ġprevious ĊĠĠĠĠĠĠĠ Ġ// Ġanimation Ġthat Ġgave Ġus Ġa Ġpositive Ġadditional Delta . ĊĠĠĠĠĠĠĠ Ġdraw Text ( canvas , Ġtext Paint , Ġcharacter List , Ġbottom Char Index Ġ- Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Delta Ġ+ Ġchar Height ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġwhether Ġthe Ġtext Ġwas Ġsuccessfully Ġdrawn Ġon Ġthe Ġcanvas ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdraw Text ( canvas : ĠCanvas , Ġtext Paint : ĠPaint , Ġcharacter List : ĠChar Array , Ġindex : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvertical Offset : ĠFloat ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ>= Ġ 0 Ġ&& Ġindex Ġ< Ġcharacter List . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( character List , Ġindex , Ġ 1 , Ġ 0 f , Ġvertical Offset , Ġtext Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( startIndex Ġ== ĠUNKNOWN _ START _ INDEX Ġ&& Ġindex Ġ== ĠUNKNOWN _ START _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( Character . toString ( current Char ), Ġ 0 , Ġ 1 , Ġ 0 f , Ġvertical Offset , Ġtext Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( end Index Ġ== ĠUNKNOWN _ END _ INDEX Ġ&& Ġindex Ġ== ĠUNKNOWN _ END _ INDEX ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( Character . toString ( target Char ), Ġ 0 , Ġ 1 , Ġ 0 f , Ġvertical Offset , Ġtext Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUNKNOWN _ START _ INDEX Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠUNKNOWN _ END _ INDEX Ġ= Ġ- 2 ĊĠĠĠ Ġ} Ċ Ċ }