/* Ċ Ġ* ĠĠ ĠCopyright Ġ 2 0 1 8 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* ĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* ĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* ĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ Ċ package Ġdev . sas ikan th . color sheet . widgets Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . util . Typed Value Ċ import Ġandroidx . annotation . Restrict To Ċ import Ġandroidx . appcompat . widget . AppCompat TextView Ċ import Ġdev . sas ikan th . color sheet . R Ċ Ċ @ Restrict To ( Restrict To . Scope . LIBRARY _ GROUP ) Ċ open Ġclass ĠBase line Grid TextView Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġandroid . R . attr . textView Style Ċ ) Ġ: ĠAppCompat TextView ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġfour Dip : ĠFloat ĊĊĠĠĠ Ġprivate Ġvar Ġline Height Multiplier Hint Ġ= Ġ 1 f ĊĠĠĠ Ġprivate Ġvar Ġline Height Hint Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġmax Lines By Height Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġextra Top Padding Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġextra Bottom Padding Ġ= Ġ 0 ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġcontext . obtain Styled Attributes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattrs , ĠR . style able . Baseline Grid TextView , Ġdef Style Attr , Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġline Height Multiplier Hint Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . get Float ( R . style able . Baseline Grid TextView _ line Height Multiplier Hint , Ġ 1 f ) ĊĠĠĠĠĠĠĠ Ġline Height Hint Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . get Dimension Pixel Size ( R . style able . Baseline Grid TextView _ line Height Hint , Ġ 0 ). toFloat () ĊĠĠĠĠĠĠĠ Ġmax Lines By Height Ġ= Ġa . getBoolean ( R . style able . Baseline Grid TextView _ max Lines By Height , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġa ?. recycle () ĊĊĠĠĠĠĠĠĠ Ġfour Dip Ġ= ĠTyped Value . apply Dimension ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTyped Value . COMPLEX _ UNIT _ DIP , Ġ 4 f , Ġresources . display Metrics ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġcompute Line Height () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġinclude Ġextra Ġpadding Ġto Ġplace Ġthe Ġfirst Ġline 's Ġbaseline Ġon Ġthe Ġgrid ĊĠĠĠ Ġoverride Ġfun Ġget Compound Padding Top (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . get Compound Padding Top () Ġ+ Ġextra Top Padding ĊĊĠĠĠ Ġ// Ġinclude Ġextra Ġpadding Ġto Ġmake Ġthe Ġheight Ġa Ġmultiple Ġof Ġ 4 dp ĊĠĠĠ Ġoverride Ġfun Ġget Compound Padding Bottom (): ĠInt Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . get Compound Padding Bottom () Ġ+ Ġextra Bottom Padding ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextra Top Padding Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġextra Bottom Padding Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġvar Ġheight Ġ= Ġmeasured Height ĊĠĠĠĠĠĠĠ Ġheight Ġ+= Ġensure Baseline On Grid () ĊĠĠĠĠĠĠĠ Ġheight Ġ+= Ġensure Height Grid Aligned ( height ) ĊĠĠĠĠĠĠĠ Ġset Measured Dimension ( meas ured Width , Ġheight ) ĊĠĠĠĠĠĠĠ Ġcheck Max Lines ( height , ĠMeasure Spec . get Mode ( height Measure Spec )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEns ures Ġline Ġheight Ġis Ġa Ġmultiple Ġof Ġ 4 dp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcompute Line Height () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfm Ġ= Ġpaint . font Metrics Int ĊĠĠĠĠĠĠĠ Ġval Ġfont Height Ġ= ĠMath . abs ( fm . as cent Ġ- Ġfm . desc ent ) Ġ+ Ġfm . leading ĊĠĠĠĠĠĠĠ Ġval Ġdesired Line Height Ġ= Ġif Ġ( line Height Hint Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Hint ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Height Multiplier Hint Ġ* Ġfont Height ĊĊĠĠĠĠĠĠĠ Ġval Ġbaseline Aligned Line Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( four Dip Ġ* ĠMath . ceil (( desired Line Height Ġ/ Ġfour Dip ). toDouble ()). toFloat ()). toInt () ĊĠĠĠĠĠĠĠ Ġset Line Spacing (( baseline Aligned Line Height Ġ- Ġfont Height ). toFloat (), Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnsure Ġthat Ġthe Ġfirst Ġline Ġof Ġtext Ġs its Ġon Ġthe Ġ 4 dp Ġgrid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġensure Baseline On Grid (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbaseline Ġ= Ġbaseline . toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġgrid Align Ġ= Ġbaseline Ġ% Ġfour Dip ĊĠĠĠĠĠĠĠ Ġif Ġ( grid Align Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Top Padding Ġ= Ġ( four Dip Ġ- ĠMath . ceil ( grid Align . toDouble ())). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġextra Top Padding ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnsure Ġthat Ġheight Ġis Ġa Ġmultiple Ġof Ġ 4 dp . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġensure Height Grid Aligned ( height : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgrid Over hang Ġ= Ġheight Ġ% Ġfour Dip ĊĠĠĠĠĠĠĠ Ġif Ġ( grid Over hang Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Bottom Padding Ġ= Ġ( four Dip Ġ- ĠMath . ceil ( grid Over hang . toDouble ())). toInt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġextra Bottom Padding ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhen Ġmeasured Ġwith Ġan Ġexact Ġheight , Ġtext Ġcan Ġbe Ġvert ically Ġcli pped Ġmid - line . ĠPrevent ĊĠĠĠĠ Ġ* Ġthis Ġby Ġsetting Ġthe Ġ` max Lines ` Ġproperty Ġbased Ġon Ġthe Ġavailable Ġspace . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Max Lines ( height : ĠInt , Ġheight Mode : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! max Lines By Height Ġ|| Ġheight Mode Ġ!= ĠMeasure Spec . EX ACT LY ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġtext Height Ġ= Ġheight Ġ- Ġcompound Padding Top Ġ- Ġcompound Padding Bottom ĊĠĠĠĠĠĠĠ Ġval Ġcomplete Lines Ġ= ĠMath . floor (( text Height Ġ/ Ġline Height ). toDouble ()). toInt () ĊĠĠĠĠĠĠĠ Ġmax Lines Ġ= Ġcomplete Lines ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Line Height Hint ( line Height Hint : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . line Height Hint Ġ= Ġline Height Hint ĊĠĠĠĠĠĠĠ Ġcompute Line Height () ĊĠĠĠ Ġ} Ċ } Ċ