package Ġeu . kan ade . t ach iy omi . widget Ċ Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Anim atable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . annotation . Attr Res Ċ import Ġandroidx . annotation . Style Res Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . core . view . do On Next Layout Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . core . view . update LayoutParams Ċ import Ġandroidx . interpol ator . view . animation . Fast Out Slow In Interpolator Ċ import Ġeu . kan ade . t ach iy omi . R Ċ import Ġeu . kan ade . t ach iy omi . databinding . M anga Summary Binding Ċ import Ġeu . kan ade . t ach iy omi . util . system . anim ator Duration Scale Ċ import Ġeu . kan ade . t ach iy omi . util . system . copy To Clipboard Ċ import Ġeu . kan ade . t ach iy omi . util . view . set Chips Ċ import Ġkotlin . math . round ToInt Ċ import Ġkotlin . math . round To Long Ċ Ċ class ĠM anga Summary View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġ@ Attr Res Ġdef Style Attr : ĠInt Ġ= Ġ 0 , ĊĠĠĠ Ġ@ Style Res Ġdef Style Res : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠFrame Layout ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbinding Ġ= ĠM anga Summary Binding . inflate ( LayoutInflater . from ( context ), Ġthis , Ġtrue ) ĊĊĠĠĠ Ġprivate Ġvar Ġanim ator Set : ĠAn imator Set ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġre calculate Height s Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdesc Expanded Height Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġdesc Sh run k Height Ġ= Ġ- 1 ĊĊĠĠĠ Ġvar Ġexpanded Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Expand State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġdescription : ĠCharSequence ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġif Ġ( value . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . unknown ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description Text . text Ġ= Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre calculate Height s Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo On Next Layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Expand State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isIn Layout ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Tags ( items : ĠList < String > ?, ĠonClick : Ġ( item : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf NotNull ( binding . tag Chips Sh run k , Ġbinding . tag Chips Expanded ). forEach Ġ{ Ġch ips Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġch ips . set Chips ( items , ĠonClick ) Ġ{ Ġtag Ġ-> Ġcontext . copy To Clipboard ( tag , Ġtag ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Expand State () Ġ= Ġbinding . apply Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Setup Ġ= Ġdescription Text . max Height Ġ< Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġval ĠmaxHeight Target Ġ= Ġif Ġ( expanded ) Ġdesc Expanded Height Ġelse Ġdesc Sh run k Height ĊĠĠĠĠĠĠĠ Ġval ĠmaxHeight Start Ġ= Ġif Ġ( initial Setup ) ĠmaxHeight Target Ġelse Ġdescription Text . max Height ĊĠĠĠĠĠĠĠ Ġval Ġdesc Max Height Animator Ġ= ĠValue Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Int Values ( max Height Start , ĠmaxHeight Target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Text . max Height Ġ= Ġit . animated Value Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtoggle Drawable Ġ= ĠContext Compat . get Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expanded ) ĠR . drawable . anim _ caret _ up Ġelse ĠR . drawable . anim _ caret _ down ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġtoggle More . setImage Drawable ( toggle Drawable ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġpast Half Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġtoggle Target Ġ= Ġif Ġ( expanded ) Ġ 1 F Ġelse Ġ 0 F ĊĠĠĠĠĠĠĠ Ġval Ġtoggle Start Ġ= Ġif Ġ( initial Setup ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Target ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle More . translation Y Ġ/ Ġtoggle More . height ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtoggle Animator Ġ= ĠValue Animator (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Float Values ( toggle Start , Ġtoggle Target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġit . animated Value Ġas ĠFloat ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle More . translation Y Ġ= Ġtoggle More . height Ġ* Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription S cri m . translation Y Ġ= Ġtoggle More . translation Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle More S cri m . translation Y Ġ= Ġtoggle More . translation Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Chips Sh run k Container . update LayoutParams < Constraint Layout . LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġtoggle More . translation Y . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Chips Expanded . update LayoutParams < Constraint Layout . LayoutParams > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Margin Ġ= Ġtoggle More . translation Y . round ToInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġnon - anim atable Ġobjects Ġmid - animation Ġmakes Ġit Ġfeel Ġless Ġa br upt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . animated Fraction Ġ>= Ġ 0 . 5 F Ġ&& Ġ! past Half ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpast Half Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Text . text Ġ= Ġtrim When Needed ( description ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Chips Sh run k Container . scroll X Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Chips Sh run k Container . isVisible Ġ= Ġ! expanded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Chips Expanded . isVisible Ġ= Ġexpanded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanim ator Set ?. cancel () ĊĠĠĠĠĠĠĠ Ġanim ator Set Ġ= ĠAn imator Set (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= ĠFast Out Slow In Interpolator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ( TO GGLE _ ANIM _ DURATION Ġ* Ġcontext . anim ator Duration Scale ). round To Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay To gether ( toggle Animator , Ġdesc Max Height Animator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( toggle Drawable Ġas ? ĠAnim atable )?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrim When Needed ( text : ĠCharSequence ?): ĠCharSequence ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . replace ( Regex (" Ġ+ \ $", Ġset Of ( Regex Option . MULT IL INE )), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . replace ( Regex ("[ \\ r \\ n ]{ 2 , }", Ġset Of ( Regex Option . MULT IL INE )), Ġ"\ n ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Measure ( width Measure Spec : ĠInt , Ġheight Measure Spec : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġuntil Ġparent Ġview Ġhas Ġdetermined Ġthe Ġexact Ġwidth ĊĠĠĠĠĠĠĠ Ġ// Ġbecause Ġthis Ġaffect Ġthe Ġdescription Ġline Ġcount ĊĠĠĠĠĠĠĠ Ġval Ġmeasure Width Fre ely Ġ= ĠMeasure Spec . get Mode ( width Measure Spec ) Ġ!= ĠMeasure Spec . EX ACT LY ĊĠĠĠĠĠĠĠ Ġif Ġ(! re calculate Height s Ġ|| Ġmeasure Width Fre ely ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre calculate Height s Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠMeasure Ġwith Ġexpanded Ġlines ĊĠĠĠĠĠĠĠ Ġbinding . description Text . max Lines Ġ= ĠInt . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġdesc Expanded Height Ġ= Ġbinding . description Text . meas ured Height ĊĊĠĠĠĠĠĠĠ Ġ// ĠMeasure Ġwith Ġsh run k Ġlines ĊĠĠĠĠĠĠĠ Ġbinding . description Text . max Lines Ġ= ĠS HR UNK _ DESC _ MAX _ LINES ĊĠĠĠĠĠĠĠ Ġsuper . on Measure ( width Measure Spec , Ġheight Measure Spec ) ĊĠĠĠĠĠĠĠ Ġdesc Sh run k Height Ġ= Ġbinding . description Text . meas ured Height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . description Text . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSo Ġthat Ġ 1 Ġline Ġof Ġtext Ġwon 't Ġbe Ġhidden Ġby Ġs cri m ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmin Lines Ġ= ĠDESC _ MIN _ LINES ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . copy To Clipboard ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getString ( R . string . description ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description Text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . description S cri m , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toggle More S cri m , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . toggle More ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . setOnClickListener Ġ{ Ġexpanded Ġ= Ġ! expanded Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠTO GGLE _ ANIM _ DURATION Ġ= Ġ 3 0 0 L Ċ Ċ private Ġconst Ġval ĠDESC _ MIN _ LINES Ġ= Ġ 2 Ċ private Ġconst Ġval ĠS HR UNK _ DESC _ MAX _ LINES Ġ= Ġ 3 Ċ