package Ġcom . iv anc arr as . mult iline _ coll ap sing _ toolbar . atom Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . text . Layout Ċ import Ġandroid . text . Static Layout Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . appcompat . content . res . AppCompat Resources Ċ import Ġandroidx . constraint layout . motion . widget . Motion Layout Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . core . widget . Nested ScrollView Ċ import Ġandroidx . fragment . app . Fragment Container View Ċ import Ġcom . iv anc arr as . mult iline _ coll ap sing _ toolbar . R Ċ import Ġkotlinx . android . synt hetic . main . mult iline _ coll ap sing _ toolbar . view .* Ċ Ċ class ĠMulti Line Col lap sing Toolbar Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġcontext : ĠContext , ĊĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠConstraint Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĊĠĠĠ Ġval Ġfragment Container View : ĠFragment Container View ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcontent ĊĠĠĠ Ġval Ġnested ScrollView : ĠNested ScrollView ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġscroll View ĊĠĠĠ Ġval Ġmotion Layout View : ĠMotion Layout ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmotion Layout ĊĊĠĠĠ Ġvar Ġnavigation Icon OnClick : Ġ(() Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġis Transition Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmotion Layout . get Transition ( R . id . coll ap sing Transition ). isEnabled ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotion Layout . get Transition ( R . id . coll ap sing Transition ). set Enable ( value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠView . inflate ( context , ĠR . layout . mult iline _ coll ap sing _ toolbar , Ġthis ) ĊĠĠĠĠĠĠĠ Ġretrieve Styled Attributes ( attrs ) ĊĠĠĠĠĠĠĠ Ġnavigation Icon . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation Icon OnClick ?. invoke () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġretrieve Styled Attributes ( attrs : ĠAttributeSet ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . obtain Styled Attributes ( attrs , ĠR . style able . Multi Line Col lap sing Toolbar ) ĊĠĠĠĠĠĠĠ Ġset Navigation Icon ( new Icon Ġ= Ġtyped Array . navigation Icon ) ĊĠĠĠĠĠĠĠ ĠsetTitle ( new Title Ġ= Ġtyped Array . title ) ĊĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ ĠThe Ġtransition Ġis Ġonly Ġenabled Ġif Ġthe Ġscroll Ġview Ġcan Ġscroll Ġbecause Ġthe Ġcontainer Ġview Ġis Ġbigger Ġthan Ġthe Ġscroll ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠshouldBe The Transition Enabled () Ġ= ĊĠĠĠĠĠĠĠ Ġfragment Container View . height Ġ> Ġnested ScrollView . height ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Transition Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġis Transition Enabled Ġ= ĠshouldBe The Transition Enabled () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Navigation Icon ( new Icon : ĠDrawable ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Icon . setImage Drawable ( new Icon ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetTitle ( new Title : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle . text Ġ= Ġnew Title ĊĠĠĠĠĠĠĠ Ġtitle . view Tree Observer . add On Pre Draw Listener ( object Ġ: ĠView Tree Observer . On Pre Draw Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Pre Draw (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . view Tree Observer . remove On Pre Draw Listener ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre calculate Title Constraints () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Transition Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ Ċ /* ĊĠĠ ĠWe Ġhave Ġto Ġre calculate Ġthe Ġexpanded Ġheight Ġof Ġthe Ġview Ġbecause Ġif Ġwe Ġuse Ġwrap _ content Ġthe Ġconstraints ĊĠĠ Ġpro voke Ġa Ġf lick ering Ġmovement Ġin Ġthe Ġtext Ġwhen Ġyou Ġscroll Ġ, Ġso Ġit 's Ġneeded Ġdefine Ġthe Ġexpanded Ġtext Ġheight Ċ Ġ*/ ĊĊĠĠĠ Ġprivate Ġfun Ġre calculate Title Constraints () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraint To Modify Ġ= Ġmotion Layout . get Constraint Set ( R . id . expanded ) ĊĊĠĠĠĠĠĠĠ Ġconstraint To Modify . constr ain Height ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . title , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . get Pre Rendered Height () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġconstraint To Modify . apply To ( motion Layout ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTextView . get Pre Rendered Height (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( parent Ġas ĠView ). width Ġ- Ġ( title . layout Params Ġas ĠLayout Params ). margin Start Ġ- Ġ( title . layout Params Ġas ĠLayout Params ). margin End ĊĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġget Pre Renderer Layout ( parent Width ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlayout . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠTextView . get Pre Renderer Layout ( parent Width : ĠInt ): ĠStatic Layout Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . LO L LI POP _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatic Layout . Builder . obtain ( text , Ġ 0 , Ġtext . length , Ġtitle . paint , Ġparent Width ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Alignment ( Layout . Alignment . ALIGN _ NORMAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Line Spacing ( 0 . 0 f , Ġ 1 . 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Include Pad ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStatic Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle . paint , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLayout . Alignment . ALIGN _ NORMAL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 f , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ= ĊĠĠĠĠĠĠĠ ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Float ( TRANS ITION _ PROGRESS , Ġmotion Layout View . progress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( SUPER _ STATE , Ġsuper . on Save InstanceState ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( state Ġis ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Motion Layout Progress ( state ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state . get Parcelable ( SUPER _ STATE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( state ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore Motion Layout Progress ( state : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtitle . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmotion Layout View . progress Ġ= Ġstate . get Float ( TRANS ITION _ PROGRESS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠTyped Array . title : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠgetString ( R . style able . Multi Line Col lap sing Toolbar _ title ) ĊĠĠĠ Ġprivate Ġval ĠTyped Array . navigation Icon : ĠDrawable ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget Drawable ( R . style able . Multi Line Col lap sing Toolbar _ on Back Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAppCompat Resources . get Drawable ( context , ĠR . drawable . ic _ back _ arrow ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTRANS ITION _ PROGRESS Ġ= Ġ" TRANS ITION _ PROGRESS " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSUP ER _ STATE Ġ= Ġ" SUPER _ STATE " ĊĠĠĠ Ġ} Ċ }