package Ġir . dr ax . expand able Ċ Ċ import Ġandroid . animation . Time Interpolator Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . transition . Change Bounds Ċ import Ġandroid . transition . Transition Manager Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ImageView Ċ import Ġandroid . widget . TextView Ċ import Ġandroidx . constraint layout . widget . Constraint Layout Ċ import Ġandroidx . constraint layout . widget . Constraint Set Ċ import Ġandroidx . constraint layout . widget . Constraints Ċ import Ġandroidx . core . content . res . Resources Compat Ċ import Ġjava . util .* Ċ Ċ class ĠExpand able Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattrs : Attribute Set ?= null , Ġdef Style Attr : Int = 0 ) Ġ Ġ: ĠConstraint Layout ( context , attrs , def Style Attr ), ĠObserver Ġ{ ĊĠĠĠ Ġval Ġstate Observable Ġ= ĠState Observable ( true ) ĊĠĠĠ Ġval ĠCOL LAP SE _ DURATION = 2 5 0 ĊĠĠĠ Ġval ĠEXP AND _ DURATION = 3 5 0 ĊĠĠĠ Ġval ĠM ARGIN _ START = 1 6 ĊĠĠĠ Ġprivate Ġvar Ġchild s Ġ= ĠlistOf < View >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup (){ ĊĠĠĠĠĠĠĠ ĠLayoutInflater . from ( context ). inflate ( R . layout . expand able _ layout , this , true ) ĊĊĠĠĠĠĠĠĠ Ġstate Observable . add Observer ( this ) ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . header ). setOnClickListener Ġ{ toggle ()} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġupdate ( observable : ĠObservable ?, Ġobj : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( obj Ġas ĠBoolean ) Ġenable () Ġelse Ġdisable () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable (){ ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . header _ icon ). background = Resources Compat . get Drawable ( resources , R . drawable . expand able _ header _ enabled , null ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition = Change Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator = ĠTime Interpolator Ġ{ time -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild s . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time == 0 f ) Ġit . visibility = ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . alpha = time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration = ĠEXP AND _ DURATION . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( this , transition ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild s . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . visibility = ĠVIS IBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= ĠConstraint Set (); ĊĠĠĠĠĠĠĠ Ġbefore . clone ( this ); ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġchild ) Ġin Ġchild s . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . connect ( child . id , ĠConstraint Set . TOP , Ġif ( index Ġ== Ġ 0 ) ĠR . id . header Ġelse Ġchild s [ index - 1 ]. id , ĠConstraint Set . BOTTOM ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . setVisibility ( child . id , Constraint Set . VISIBLE ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . set Margin ( child . id , ĠConstraint Set . TOP , ĠM ARGIN _ START ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbefore . apply To ( this ); ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable (){ ĊĠĠĠĠĠĠĠ ĠfindViewById < View >( R . id . header _ icon ). background = Resources Compat . get Drawable ( resources , R . drawable . expand able _ header _ disabled , null ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition = Change Bounds () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransition . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator = ĠTime Interpolator Ġ{ time -> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild s . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( time == 1 f ) Ġit . visibility = ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġit . alpha = 1 - time ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration = COLL AP SE _ DURATION . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠTransition Manager . begin Delayed Transition ( this , transition ) ĊĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild s . on Each Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . visibility = ĠG ONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= ĠConstraint Set (); ĊĠĠĠĠĠĠĠ Ġbefore . clone ( this ); ĊĊĊĠĠĠĠĠĠĠ Ġchild s . forEach Ġ{ child -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . connect ( child . id , ĠConstraint Set . TOP , ĠR . id . header , ĠConstraint Set . TOP ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbefore . set Margin ( child . id , ĠConstraint Set . TOP , Ġ 0 ); ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbefore . apply To ( this ); ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Child ( var arg Ġviews : View Ġ): Expand able { ĊĠĠĠĠĠĠĠ Ġchild s Ġ= Ġchild s Ġ+ Ġviews ĊĠĠĠĠĠĠĠ Ġdraw Child s ( views . toList ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Child s ( views : List < View > ){ ĊĠĠĠĠĠĠĠ Ġviews . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= ĠConstraints . LayoutParams ( 0 , Constraint Layout . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . margin Start Ġ= ĠM ARGIN _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . start To Start Ġ= ĠConstraints . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . end ToEnd Ġ= ĠConstraints . LayoutParams . PARENT _ ID ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparams . top To Bottom Ġ= Ġget Child At ( child Count - 1 ). id ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . visibility Ġ= Ġif Ġ( state Observable . state ) View . VISIBLE Ġelse ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Count Ġ> Ġ 1 ) Ġparams . top Margin Ġ= ĠM ARGIN _ START ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . id Ġ== Ġ- 1 ) Ġit . id = ĠSystem . currentTimeMillis (). plus ( child Count ). toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( it , params ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtitle : String ="" ĊĠĠĠĠĠĠĠ Ġset Ġ( new Title ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield = new Title ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < TextView >( R . id . title ). text Ġ= Ġ Ġnew Title Ġ} ĊĊĠĠĠ Ġvar Ġicon : Int = Ġ 0 ĊĠĠĠĠĠĠĠ Ġset Ġ( new Icon ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield = new Icon ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < ImageView >( R . id . header _ icon ). setImage Resource ( new Icon ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġcollapse () Ġ{ Ġstate Observable . state Ġ= Ġfalse Ġ} ĊĠĠĠ Ġfun Ġexpand () Ġ{ Ġstate Observable . state Ġ= Ġtrue Ġ} ĊĠĠĠ Ġfun Ġtoggle () Ġ{ Ġstate Observable . state Ġ= Ġstate Observable . state . not () Ġ} Ċ }