package Ġio . me how . r uler Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . view . View Ċ import Ġjava . math . BigInteger Ċ import Ġjava . util . Locale Ċ Ċ class ĠImp erial Distance Formatter Ġinternal Ġconstructor ( ĊĠ Ġprivate Ġval Ġformat ters : ĠSet < Part Formatter >, ĊĠ Ġprivate Ġval Ġparts Separator : ĠString , Ċ ) Ġ{ ĊĠ Ġfun Ġformat ( distance : ĠDistance , Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠ Ġval Ġreverse Order Ġ= Ġcontext . preferred Locale . is R tl ĊĠĠĠ Ġreturn Ġformat Parts ( distance , Ġcontext , Ġreverse Order ) ĊĠ Ġ} ĊĊĠ Ġfun Ġformat ( length : ĠLength < Imp erial Length Unit >, Ġcontext : ĠContext ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġformat ( length . distance , Ġcontext ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġformat Parts ( distance : ĠDistance , Ġcontext : ĠContext , Ġreverse Order : ĠBoolean ): ĠString Ġ{ ĊĠĠĠ Ġval Ġlowest Hierarchy Ġ= Ġformat ters . map ( Part Formatter :: hierarchy ). max OrNull () !! ĊĠĠĠ Ġval Ġhighest Hierarchy Ġ= Ġformat ters . map ( Part Formatter :: hierarchy ). min OrNull () !! ĊĊĠĠĠ Ġval Ġlength Map Ġ= Ġformat ters . associate With Ġ{ Ġformatter Ġ-> ĊĠĠĠĠĠ Ġval Ġis Base Part Ġ= Ġformatter . hierarchy Ġ== Ġhighest Hierarchy ĊĠĠĠĠĠ Ġreturn @ associate With Ġformatter . part ( distance , Ġis Base Part ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtotal Length Ġ= Ġlength Map . values . fold ( BigInteger . ZERO ) Ġ{ Ġacc , Ġlength Ġ-> Ġacc Ġ+ Ġlength Ġ} ĊĊĠĠĠ Ġval Ġformatted Parts Ġ= Ġformat ters . map NotNull Ġ{ Ġformatter Ġ-> ĊĠĠĠĠĠ Ġval Ġpart Ġ= Ġlength Map . getValue ( formatter ) ĊĠĠĠĠĠ Ġreturn @ map NotNull Ġformatter . print Data ( context , Ġpart , Ġtotal Length , Ġlowest Hierarchy ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġlocalized Parts Ġ= Ġif Ġ( reverse Order ) Ġformatted Parts . reversed () Ġelse Ġformatted Parts ĊĠĠĠ Ġreturn Ġlocalized Parts . join ToString ( parts Separator ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPart Formatter . print Data ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġlength : ĠBigInteger , ĊĠĠĠ Ġtotal Length : ĠBigInteger , ĊĠĠĠ Ġlowest Available Hierarchy : ĠInt , ĊĠ Ġ): ĠString ? Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠ Ġcan Print Data ( length ) Ġ-> Ġformat ( context , Ġlength . to Long ()) ĊĠĠĠĠĠ Ġshould Print Data ( total Length , Ġlowest Available Hierarchy ) Ġ-> Ġformat ( context , Ġ 0 L ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPart Formatter . should Print Data ( ĊĠĠĠ Ġtotal Length : ĠBigInteger , ĊĠĠĠ Ġlowest Hierarchy : ĠInt , ĊĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtotal Length Ġ== ĠBigInteger . ZERO Ġ&& Ġhierarchy Ġ== Ġlowest Hierarchy ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPart Formatter . can Print Data ( part : ĠBigInteger ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġprint Z eros Ġ|| Ġpart Ġ!= ĠBigInteger . ZERO ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Field Ġval ĠBasic Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠ Ġ. with M iles () ĊĠĠĠĠĠĠĠ Ġ. with Y ards () ĊĠĠĠĠĠĠĠ Ġ. with Fe et () ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ@ Jvm Field Ġval ĠFull Ġ= ĠBuilder () ĊĠĠĠĠĠĠĠ Ġ. with M iles ( print Z eros Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. with Y ards ( print Z eros Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. with Fe et ( print Z eros Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. with In ches ( print Z eros Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠLocale . is R tl : ĠBoolean ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġreturn ĠText Utils . get Layout Direction From Locale ( this ) Ġ== ĠView . LAYOUT _ DIRECTION _ RTL ĊĠĠĠ Ġ} ĊĊĠ Ġclass ĠBuilder Ġprivate Ġconstructor ( private Ġval Ġformat ters : ĠSet < Part Formatter >) Ġ{ ĊĠĠĠ Ġconstructor () Ġ: Ġthis ( empty Set ()) ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun Ġwith M iles ( ĊĠĠĠĠĠ Ġvalue Separator : ĠString Ġ= Ġ"", ĊĠĠĠĠĠ Ġprint Z eros : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġreturn Ġappend ( Part Formatter . M iles ( value Separator , Ġprint Z eros )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun Ġwith Y ards ( ĊĠĠĠĠĠ Ġvalue Separator : ĠString Ġ= Ġ"", ĊĠĠĠĠĠ Ġprint Z eros : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġreturn Ġappend ( Part Formatter . Y ards ( value Separator , Ġprint Z eros )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun Ġwith Fe et ( ĊĠĠĠĠĠ Ġvalue Separator : ĠString Ġ= Ġ"", ĊĠĠĠĠĠ Ġprint Z eros : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġreturn Ġappend ( Part Formatter . Fe et ( value Separator , Ġprint Z eros )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun Ġwith In ches ( ĊĠĠĠĠĠ Ġvalue Separator : ĠString Ġ= Ġ"", ĊĠĠĠĠĠ Ġprint Z eros : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġreturn Ġappend ( Part Formatter . In ches ( value Separator , Ġprint Z eros )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild ( parts Separator : ĠString Ġ= Ġ" Ġ" ): ĠImp erial Distance Formatter Ġ{ ĊĠĠĠĠĠ Ġreturn ĠImp erial Distance Formatter ( format ters , Ġparts Separator ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġappend ( formatter : ĠPart Formatter ): ĠBuilder Ġ{ ĊĠĠĠĠĠ Ġreturn ĠBuilder ( format ters Ġ+ Ġformatter ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ internal Ġsealed Ġclass ĠPart Formatter Ġ{ ĊĠ Ġabstract Ġval Ġseparator : ĠString ĊĠ Ġabstract Ġval Ġprint Z eros : ĠBoolean ĊĠ Ġabstract Ġval Ġhierarchy : ĠInt ĊĠ Ġabstract Ġval Ġresource : ĠInt ĊĊĠ Ġfun Ġformat ( context : ĠContext , Ġdistance : ĠLong ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġcontext . getString ( resource , Ġdistance , Ġseparator ) ĊĠ Ġ} ĊĊĠ Ġfun Ġpart ( distance : ĠDistance , Ġis Base Part : ĠBoolean ): ĠBigInteger Ġ{ ĊĠĠĠ Ġval Ġextra Part Ġ= Ġif Ġ( is Base Part ) Ġdistance . extract Extra Part () Ġelse Ġ 0 . to BigInteger () ĊĠĠĠ Ġreturn Ġdistance . extract Part () Ġ+ Ġextra Part ĊĠ Ġ} ĊĊĠ Ġprotected Ġabstract Ġfun ĠDistance . extract Part (): ĠBigInteger ĊĊĠ Ġprotected Ġabstract Ġfun ĠDistance . extract Extra Part (): ĠBigInteger ĊĊĠ Ġabstract Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean ĊĊĠ Ġabstract Ġoverride Ġfun ĠhashCode (): ĠInt ĊĊĠ Ġclass ĠM iles ( ĊĠĠĠ Ġoverride Ġval Ġseparator : ĠString , ĊĠĠĠ Ġoverride Ġval Ġprint Z eros : ĠBoolean , ĊĠ Ġ) Ġ: ĠPart Formatter () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġhierarchy Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġval Ġresource Ġ= ĠR . string . io _ me how _ r uler _ m iles _ part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Part () Ġ= Ġm iles Part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Extra Part () Ġ= Ġ 0 . to BigInteger () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠM iles ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġ 1 ĊĠ Ġ} ĊĊĠ Ġclass ĠY ards ( ĊĠĠĠ Ġoverride Ġval Ġseparator : ĠString , ĊĠĠĠ Ġoverride Ġval Ġprint Z eros : ĠBoolean , ĊĠ Ġ) Ġ: ĠPart Formatter () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġhierarchy Ġ= Ġ 1 ĊĠĠĠ Ġoverride Ġval Ġresource Ġ= ĠR . string . io _ me how _ r uler _ y ards _ part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Part () Ġ= Ġy ards Part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Extra Part () Ġ= Ġtotal M iles Ġ* Ġ 1 _ 7 6 0 . to BigInteger () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠY ards ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġ 2 ĊĠ Ġ} ĊĊĠ Ġclass ĠFe et ( ĊĠĠĠ Ġoverride Ġval Ġseparator : ĠString , ĊĠĠĠ Ġoverride Ġval Ġprint Z eros : ĠBoolean , ĊĠ Ġ) Ġ: ĠPart Formatter () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġhierarchy Ġ= Ġ 2 ĊĠĠĠ Ġoverride Ġval Ġresource Ġ= ĠR . string . io _ me how _ r uler _ fe et _ part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Part () Ġ= Ġfeet Part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Extra Part () Ġ= Ġtotal Y ards Ġ* Ġ 3 . to BigInteger () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠFe et ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġ 3 ĊĠ Ġ} ĊĊĠ Ġclass ĠIn ches ( ĊĠĠĠ Ġoverride Ġval Ġseparator : ĠString , ĊĠĠĠ Ġoverride Ġval Ġprint Z eros : ĠBoolean , ĊĠ Ġ) Ġ: ĠPart Formatter () Ġ{ ĊĠĠĠ Ġoverride Ġval Ġhierarchy Ġ= Ġ 3 ĊĠĠĠ Ġoverride Ġval Ġresource Ġ= ĠR . string . io _ me how _ r uler _ inches _ part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Part () Ġ= Ġin ches Part ĊĊĠĠĠ Ġoverride Ġfun ĠDistance . extract Extra Part () Ġ= Ġtotal Fe et Ġ* Ġ 1 2 . to BigInteger () ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠIn ches ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġ 4 ĊĠ Ġ} Ċ } Ċ Ċ internal Ġval ĠDistance . total M iles : ĠBigInteger ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn Ġ( exact Total Met ers Ġ/ Ġ 1 _ 6 0 9 . 3 4 4 . to BigDecimal ()). to BigInteger () ĊĠ Ġ} Ċ Ċ internal Ġval ĠDistance . m iles Part Ġget () Ġ= Ġtotal M iles Ċ Ċ internal Ġval ĠDistance . total Y ards : ĠBigInteger ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn Ġ( exact Total Met ers Ġ/ Ġ 0 . 9 _ 1 4 4 . to BigDecimal ()). to BigInteger () ĊĠ Ġ} Ċ Ċ internal Ġval ĠDistance . y ards Part Ġget () Ġ= Ġtotal Y ards Ġ% Ġ 1 _ 7 6 0 . to BigInteger () Ċ Ċ internal Ġval ĠDistance . total Fe et : ĠBigInteger ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn Ġ( exact Total Met ers Ġ/ Ġ 0 . 3 _ 0 4 8 . to BigDecimal ()). to BigInteger () ĊĠ Ġ} Ċ Ċ internal Ġval ĠDistance . fe et Part Ġget () Ġ= Ġtotal Fe et Ġ% Ġ 3 . to BigInteger () Ċ Ċ internal Ġval ĠDistance . total In ches : ĠBigInteger ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġreturn Ġ( exact Total Met ers Ġ/ Ġ 0 . 0 _ 2 5 4 . to BigDecimal ()). to BigInteger () ĊĠ Ġ} Ċ Ċ internal Ġval ĠDistance . inches Part Ġget () Ġ= Ġtotal In ches Ġ% Ġ 1 2 . to BigInteger () Ċ