/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . best . desk clock . widget Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . TextView Ċ Ċ /** Ċ Ġ* ĠWhen Ġthis Ġlayout Ġis Ġin Ġthe ĠHorizontal Ġorientation Ġand Ġone Ġand Ġonly Ġone Ġchild Ġis Ġa ĠTextView Ġwith Ġa Ċ Ġ* Ġnon - null Ġandroid : el lip size , Ġthis Ġlayout Ġwill Ġreduce Ġandroid : maxWidth Ġof Ġthat ĠTextView Ġto Ġensure Ċ Ġ* Ġthe Ġs iblings Ġare Ġnot Ġtruncated . ĠThis Ġclass Ġis Ġuseful Ġwhen Ġthat Ġel lip size - text - view Ġ" starts " Ċ Ġ* Ġbefore Ġother Ġchildren Ġof Ġthis Ġview Ġgroup . ĠThis Ġlayout Ġhas Ġno Ġeffect Ġif : Ċ Ġ* Ġ< ul > Ċ Ġ* ĠĠĠĠ Ġ< li > the Ġorientation Ġis Ġnot Ġhorizontal </ li > Ċ Ġ* ĠĠĠĠ Ġ< li > any Ġchild Ġhas Ġweights .</ li > Ċ Ġ* ĠĠĠĠ Ġ< li > more Ġthan Ġone Ġchild Ġhas Ġa Ġnon - null Ġandroid : el lip size .</ li > Ċ Ġ* Ġ</ ul > Ċ Ġ* Ċ Ġ* ĠThe Ġpurpose Ġof Ġthis Ġhorizontal - linear - layout Ġis Ġto Ġensure Ġthat Ġwhen Ġthe Ġsum Ġof Ġwidths Ġof Ġthe Ċ Ġ* Ġchildren Ġare Ġgreater Ġthan Ġthis Ġparent , Ġthe Ġmaximum Ġwidth Ġof Ġthe Ġel lip size - text - view , Ġis Ġreduced Ċ Ġ* Ġso Ġthat Ġno Ġs iblings Ġare Ġtruncated . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠFor Ġexample : ĠGiven ĠText 1 Ġhas Ġandroid : el lip size =" end " Ġand ĠText 2 Ġhas Ġandroid : el lip size =" none ", Ċ Ġ* Ġas ĠText 1 Ġand / or ĠText 2 Ġgrow Ġin Ġwidth , Ġboth Ġwill Ġconsume Ġmore Ġwidth Ġuntil ĠText 2 Ġhits Ġthe Ġend Ċ Ġ* Ġmargin , Ġthen ĠText 1 Ġwill Ġce ase Ġto Ġgrow Ġand Ġinstead Ġshrink Ġto Ġac commod ate Ġany Ġfurther Ġgrowth Ġin Ċ Ġ* ĠText 2 . Ċ Ġ* Ġ< ul > Ċ Ġ* Ġ< li > |[ text 1 ] |[ text 2 ] ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| </ li > Ċ Ġ* Ġ< li > |[ text 1 Ġtext 1 ] |[ text 2 Ġtext 2 ] Ġ Ġ| </ li > Ċ Ġ* Ġ< li > |[ text ... Ġ] |[ text 2 Ġtext 2 Ġtext 2 ]| </ li > Ċ Ġ* Ġ</ ul > Ċ Ġ*/ Ċ class ĠEl lip size Layout Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext ?, ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull Ċ ) Ġ: ĠLinearLayout ( context , Ġattrs ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġoverride Ġonly Ġacts Ġwhen Ġthe ĠLinearLayout Ġis Ġin Ġthe ĠHorizontal Ġorientation Ġand Ġis Ġin Ġit 's ĊĠĠĠĠ Ġ* Ġfinal Ġmeasurement Ġpass ( Measure Spec . EX ACT LY ). ĠIn Ġthis Ġcase Ġonly , Ġthis Ġclass ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ Ġ* ĠIdent ifies Ġthe Ġone ĠTextView Ġchild Ġwith Ġthe Ġnon - null Ġandroid : el lip size . ĊĠĠĠĠ Ġ* Ġ Ġ* ĠRe - meas ures Ġthe Ġneeded Ġwidth Ġof Ġall Ġchildren Ġ( by Ġcalling Ġmeasure Child With Margins Ġwith ĊĠĠĠĠ Ġ* Ġthe Ġwidth Ġmeasure Ġspecification Ġto ĠMeasure Spec . UNSPECIFIED .) ĊĠĠĠĠ Ġ* Ġ Ġ* ĠSum s Ġthe Ġchildren 's Ġwidths . ĊĠĠĠĠ Ġ* Ġ Ġ* ĠWh enever Ġthe Ġsum Ġof Ġthe Ġchildren 's Ġwidths Ġis Ġgreater Ġthan Ġthis Ġparent Ġwas Ġallocated , ĊĠĠĠĠ Ġ* Ġthe Ġmaximum Ġwidth Ġof Ġthe Ġone ĠTextView Ġchild Ġwith Ġthe Ġnon - null Ġandroid : el lip size Ġis ĊĠĠĠĠ Ġ* Ġreduced . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġwidth Measure Spec Ġhorizontal Ġspace Ġrequirements Ġas Ġimp osed Ġby Ġthe Ġparent ĊĠĠĠĠ Ġ* Ġ@ param Ġheight Measure Spec Ġvertical Ġspace Ġrequirements Ġas Ġimp osed Ġby Ġthe Ġparent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠH ORIZONTAL Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . get Mode ( width Measure Spec ) Ġ== ĠMeasure Spec . EX ACT LY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġany Ġof Ġthe Ġconstraints Ġof Ġthis Ġclass Ġare Ġexceeded , Ġout Of Spec Ġbecomes Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġand Ġthe Ġno Ġalter ations Ġare Ġmade Ġto Ġthe Ġel lip size - text - view . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġout Of Spec Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġel lip size View : ĠTextView ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġchild Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Width Ġ= ĠMeasure Spec . getSize ( width Measure Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Width Measure Spec Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . make Measure Spec ( Measure Spec . getSize ( width Measure Spec ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMeasure Spec . UNSPECIFIED ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġii Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( ii Ġ< Ġcount Ġ&& Ġ! out Of Spec ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Ġ= Ġget Child At ( ii ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġ!= Ġnull Ġ&& Ġchild . visibility Ġ!= ĠView . GONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIdent ify Ġthe Ġel lip size Ġview ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Ġis ĠTextView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtv Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tv . el lip size Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( el lip size View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel lip size View Ġ= Ġtv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClear Ġthe Ġmaximum Ġwidth Ġon Ġel lip size View Ġbefore Ġmeasurement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel lip size View . maxWidth Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsupport Ġmultiple Ġandroid : el lip size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Of Spec Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAsk Ġthe Ġchild Ġto Ġmeasure Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasure Child With Margins ( child , Ġquery Width Measure Spec , Ġ 0 , Ġheight Measure Spec , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġthe Ġlayout Ġparameters Ġto Ġcheck Ġfor Ġa Ġweighted Ġwidth Ġand Ġto Ġadd Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchild 's Ġmargins Ġto Ġthe Ġtotal Ġlength . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġchild . layout Params Ġas ĠLayout Params ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( layout Params Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Of Spec Ġ= Ġout Of Spec Ġor Ġ( layout Params . weight Ġ> Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Length Ġ+= Ġ( child . meas ured Width Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . left Margin Ġ+ Ġlayout Params . right Margin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Of Spec Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ ii ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLast Ġconstraint Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout Of Spec Ġ= Ġout Of Spec Ġor Ġ( el lip size View Ġ== Ġnull Ġ|| Ġtotal Length Ġ== Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! out Of Spec Ġ&& Ġtotal Length Ġ> Ġparent Width ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠmaxWidth Ġ= Ġel lip size View !!. meas ured Width Ġ- Ġ( total Length Ġ- Ġparent Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠRes pect Ġandroid : min Width Ġ( easy Ġwith Ġ@ Target Api ( 1 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠminWidth Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( maxWidth Ġ< ĠminWidth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= ĠminWidth ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel lip size View . maxWidth Ġ= ĠmaxWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠ Ġ} Ċ }