package Ġcom . n amb im obile . widgets . ef ab Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . animation . Animator Set Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . coordinator layout . widget . Coordinator Layout Ċ import Ġandroidx . core . view . View Compat Ċ Ċ /** Ċ Ġ* ĠThe Ġcontainer Ġand Ġcontroller Ġfor Ġall Ġchildren Ġviews Ġof Ġthe ĠExpand able Fab Ġwidget Ġ( Overlay , Ċ Ġ* ĠExpand able Fab , ĠF ab Option , ĠLabel ). ĠThe ĠExpand able Fab Layout Ġhandles Ġthe Ġbulk Ġof Ġthe Ġfunctionality Ċ Ġ* Ġfor Ġthe ĠExpand able Fab Ġwidget Ġas Ġa Ġwhole Ġ( from Ġcoord in ating Ġopening Ġand Ġclosing Ġanimations Ġto Ċ Ġ* Ġscreen Ġorientation Ġchanges , Ġetc ). ĠSee Ġbelow Ġfor Ġan Ġexample Ġon Ġhow Ġto Ġeasily Ġset Ġup Ġthe Ċ Ġ* ĠExpand able Fab Ġwidget Ġusing Ġthe ĠExpand able Fab Layout Ġas Ġthe Ġcontaining ĠViewGroup . Ċ Ġ* Ċ Ġ* ĠPro tip : ĠIf Ġyou Ġonly Ġset Ġa Ġsingle ĠExpand able Fab Ġwidget , Ġit Ġwill Ġautomatically Ġbe Ġused Ġfor Ġboth Ċ Ġ* Ġpor trait Ġand Ġlandscape Ġorient ations . ĠNo Ġneed Ġto Ġset Ġduplicate Ġviews Ġif Ġyou Ġwould Ġlike Ġthe Ġsame Ċ Ġ* Ġwidget Ġin Ġboth Ġorient ations . ĠIf Ġyou Ġwould Ġlike Ġtwo Ġdifferent Ġwidgets Ġfor Ġpor trait Ġand Ċ Ġ* Ġlandscape Ġhowever , Ġyou Ġcan Ġdo Ġso Ġby Ġexplicitly Ġdefining Ġdifferent Ġorient ations Ġfor Ġthe Ċ Ġ* Ġdifferent Ġsets Ġof Ġwidget Ġviews . ĠIn Ġthe Ġexample Ġbelow Ġwe Ġdon 't Ġset Ġorientation Ġfor Ġany Ġof Ġthe Ċ Ġ* Ġviews , Ġso Ġthey Ġdefault Ġto Ġ' portrait '. ĠHowever , Ġsince Ġwe Ġdidn 't Ġexplicitly Ġset Ġlandscape Ġviews , Ċ Ġ* Ġthe Ġwidget Ġwill Ġactually Ġbe Ġused Ġfor Ġboth Ġpor trait Ġ* and * Ġlandscape . Ċ Ġ* Ċ Ġ* ĠExpand able Fab Ġwidget ĠExample Ġvia ĠXML : ĊĊĠĠĠ Ġ< com . n amb im obile . widgets . ef ab . Expand able Fab Layout ĊĠĠĠĠĠĠĠ Ġandroid : layout _ width =" match _ parent " ĊĠĠĠĠĠĠĠ Ġandroid : layout _ height =" match _ parent "> ĊĊĠĠĠĠĠĠĠ Ġ< com . n amb im obile . widgets . ef ab . Overlay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ width =" match _ parent " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ height =" match _ parent "/> ĊĊĠĠĠĠĠĠĠ Ġ< com . n amb im obile . widgets . ef ab . Expand able Fab ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ gravity =" bottom | end " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ margin Bottom ="@ dim en / ui _ margin _ medium " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ margin End ="@ dim en / ui _ margin _ medium " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ margin Right ="@ dim en / ui _ margin _ medium "/> ĊĊĠĠĠĠĠĠĠ Ġ< com . n amb im obile . widgets . ef ab . Fab Option ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ width =" wrap _ content " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid : layout _ height =" wrap _ content "/> ĊĊĠĠĠ Ġ</ com . n amb im obile . widgets . ef ab . Expand able Fab Layout > Ċ Ġ* Ċ Ġ* ĠDeveloper ĠNotes : Ċ Ġ* Ġ 1 ) ĠThe ĠExpand able Fab Layout Ġshould Ġbe Ġgiven Ġa Ġlayout _ width Ġand Ġlayout _ height Ġof Ġmatch _ parent , Ċ Ġ* Ġand Ġit Ġshould Ġbe Ġa Ġchild Ġof Ġa ĠViewGroup Ġthat Ġhas Ġaccess Ġto Ġdraw Ġover Ġthe Ġfull Ġscreen Ġas Ġwell . Ċ Ġ* ĠThis Ġis Ġnecessary Ġas Ġsome Ġviews Ġof Ġthe Ġwidget Ġ( like Ġthe Ġ[ Overlay ]) Ġmay Ġneed Ġthe Ġability Ġto Ġdraw Ċ Ġ* Ġover Ġthe Ġfull Ġscreen . ĠSetting Ġthe Ġdimensions Ġas Ġsuch Ġwill Ġnot Ġimp ede Ġthe Ġview ability , Ċ Ġ* Ġclick ability Ġor Ġfocus ability Ġof Ġany Ġother Ġviews Ġin Ġyour Ġlayout . Ċ Ġ* Ċ Ġ* ĠImplementation ĠNotes : Ċ Ġ* Ġ 1 ) ĠSince Ġthe ĠKotlin Ġ' internal ' Ġmodifier Ġtrans lates Ġto Ġ' public ' Ġin ĠJava , Ġthe Ġ[ Jvm Synt hetic ] Ċ Ġ* Ġannotation Ġis Ġused Ġon Ġthose Ġfunctions Ġand Ġproperties Ġto Ġhide Ġthem Ġfrom Ġthe Ġpublished ĠAPI Ġfor Ċ Ġ* ĠJava Ġclients . ĠA Ġproper Ġsolution Ġto Ġthis Ġissue Ġwould Ġbe Ġa Ġpackage - private Ġvisibility Ġmodifier , Ċ Ġ* Ġbut ĠKotlin Ġhas Ġyet Ġto Ġimplement Ġit Ġ( https :// yout rack . jetbrains . com / issue / KT - 2 9 2 2 7 ). ĠUnt il Ċ Ġ* Ġthen , Ġthe ĠJ vm Synt hetic Ġannotations Ġshould Ġremain Ġin Ġorder Ġto Ġpresent Ġthe Ġproper Ġpublished ĠAPI Ċ Ġ* Ġto Ġboth ĠJava Ġ& ĠKotlin Ġclients . Ċ Ġ* Ċ Ġ* Ġ@ since Ġ 1 . 0 . 0 Ċ Ġ* Ġ*/ Ċ class ĠExpand able Fab Layout Ġ: ĠCoord inator Layout Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġholder Ġfor Ġall Ġthe Ġviews Ġof Ġthe ĠExpand able Fab Ġwidget Ġdeclared Ġin Ġthe Ġpor trait Ġscreen ĊĠĠĠĠ Ġ* Ġorientation . ĠValues Ġfor Ġthe Ġviews Ġwill Ġonly Ġbe Ġpopulated Ġafter Ġthey Ġare Ġadded Ġthrough Ġcalls ĊĠĠĠĠ Ġ* Ġto ĠExpand able Fab Layout 's Ġadd View Ġmethods Ġ( or Ġafter Ġthey 're Ġdefined Ġvia ĠXML ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġvar Ġpor trait Configuration Ġ= ĠOrientation Configuration () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġholder Ġfor Ġall Ġthe Ġviews Ġof Ġthe ĠExpand able Fab Ġwidget Ġdeclared Ġin Ġthe Ġlandscape Ġscreen ĊĠĠĠĠ Ġ* Ġorientation . ĠValues Ġfor Ġthe Ġviews Ġwill Ġonly Ġbe Ġpopulated Ġafter Ġthey Ġare Ġadded Ġthrough Ġcalls ĊĠĠĠĠ Ġ* Ġto ĠExpand able Fab Layout 's Ġadd View Ġmethods Ġ( or Ġafter Ġthey 're Ġdefined Ġvia ĠXML ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġvar Ġlandscape Configuration Ġ= ĠOrientation Configuration () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ@ get : Jvm Synt hetic ĊĠĠĠ Ġ@ set : Jvm Synt hetic ĊĠĠĠ Ġinternal Ġvar Ġe fab Animations Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġget Ġ// ĠRed undant Ġdeclarations , Ġbut Ġmust Ġbe Ġdefined Ġfor ĠJ vm Synt hetic Ġto Ġhide Ġfrom ĠJava Ġclients ĊĠĠĠĠĠĠĠ Ġset ĊĠĠĠ Ġprivate Ġvar Ġgroup Animations Finished Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġopen Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġclose When Ab le Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġfab Option Already Clicked Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUsed Ġto Ġcreate Ġan ĠExpand able Fab Layout Ġprogram matically Ġ( do Ġnot Ġuse Ġthe Ġother Ġconstructor ĊĠĠĠĠ Ġ* ĠExpand able Fab Layout ( context , Ġattribute Set ) Ġ- Ġit Ġis Ġfor Ġuse Ġby Ġthe ĠAndroid Ġframework Ġwhen ĊĠĠĠĠ Ġ* Ġinfl ating Ġan ĠExpand able Fab Layout Ġvia ĠXML ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġconstructor ( context : ĠContext ): Ġsuper ( context ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġby Ġthe Ġsystem Ġwhen Ġcreating Ġan ĠExpand able Fab Layout Ġvia ĠXML Ġ( don 't Ġcall Ġthis Ġdirectly ). ĊĠĠĠĠ Ġ* ĠTo Ġcreate Ġan ĠExpand able Fab Layout Ġprogram matically , Ġuse Ġthe ĠExpand able Fab Layout ( context ) ĊĠĠĠĠ Ġ* Ġconstructor . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattribute Set : ĠAttributeSet ): Ġsuper ( context , Ġattribute Set ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( id Ġ== ĠView . NO _ ID ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= ĠView Compat . generate View Id () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ***************** ** ĠPublic Ġmethods Ġavailable Ġthrough Ġthe Ġpublished ĠAPI Ġ***************** ** Ġ\\ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġchild Ġview Ġwith Ġthe Ġspecified Ġlayout Ġparameters Ġto Ġthe ĠExpand able Fab Layout . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġgeneral , Ġonly ĠOverlay , ĠExpand able Fab , ĠF ab Option , Ġand Ġspecific ĠMaterial ĠDesign Ġviews ĊĠĠĠĠ Ġ* Ġ( like ĠSn ackbar Ġand ĠBottom AppBar ) Ġshould Ġbe Ġadded Ġas Ġchildren Ġof Ġthe ĠExpand able Fab Layout . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWhile Ġthis Ġlibrary Ġwon 't Ġstop Ġyou Ġfrom Ġadding Ġin Ġother Ġtypes Ġas Ġdirect Ġchildren Ġto Ġthe ĊĠĠĠĠ Ġ* ĠExpand able Fab Layout , Ġplease Ġknow Ġadding Ġother ĠView Ġtypes Ġmay Ġcause Ġvisual Ġissues . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġadd View ( child : ĠView ?, Ġindex : ĠInt , Ġparams : ĠViewGroup . LayoutParams ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( child ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOverlay Ġ-> Ġadd Overlay ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpand able Fab Ġ-> Ġadd Expand able Fab ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ab Option Ġ-> Ġadd Fab Option ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvenience Ġmethod Ġfor Ġadding Ġmultiple Ġ[ children ] Ġviews Ġto Ġthe ĠExpand able Fab Layout Ġat Ġonce , ĊĠĠĠĠ Ġ* Ġprogram matically . ĠEnsure Ġyour Ġchildren Ġviews Ġare Ġof Ġtype ĠOverlay , ĠExpand able Fab Ġor ĠF ab Option ĊĠĠĠĠ Ġ* Ġonly . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġadd Views ( var arg Ġchildren : ĠView ? ){ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġchildren ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( child ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġall Ġchild Ġviews Ġin Ġboth Ġpor trait Ġand Ġlandscape Ġorientation Ġfrom Ġthe ĊĠĠĠĠ Ġ* ĠExpand able Fab Layout . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġthe Ġonly Ġcorrect Ġway Ġto Ġremove Ġ* ALL * Ġviews Ġfrom Ġyour ĠExpand able Fab Ġwidget Ġshould Ġyou ĊĠĠĠĠ Ġ* Ġchoose Ġto Ġreuse Ġthe Ġsame ĠExpand able Fab Layout Ġinstead Ġof Ġinstanti ating Ġa Ġnew Ġone . ĠUsing Ġany ĊĠĠĠĠ Ġ* Ġother Ġremove View Ġvariation Ġwill Ġprovide Ġno Ġguarantees Ġof Ġproper Ġinternal Ġstate Ġcontrol , ĊĠĠĠĠ Ġ* Ġand Ġthus Ġcould Ġpotentially Ġlead Ġto ĠExceptions Ġduring Ġruntime . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġyou Ġonly Ġwant Ġto Ġremove Ġcertain ĠF ab Options , Ġget Ġthe Ġcurrent ĠOrientation Configuration ĊĠĠĠĠ Ġ* Ġ([ portrait Configuration ] Ġor Ġ[ land scape Configuration ] Ġor Ġ[ getCurrent Configuration ]), Ġthen ĊĠĠĠĠ Ġ* Ġcall Ġremove ( Fab Option ) Ġor Ġremove ( int ) Ġ( the Ġlatter Ġis Ġnamed Ġremove At ( int ) Ġin ĠKotlin ) Ġon Ġits ĊĠĠĠĠ Ġ* Ġlist Ġof ĠF ab Options . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġremove All Views () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . removeAll Views () ĊĊĠĠĠĠĠĠĠ Ġpor trait Configuration Ġ= ĠOrientation Configuration () ĊĠĠĠĠĠĠĠ Ġlandscape Configuration Ġ= ĠOrientation Configuration () ĊĠĠĠĠĠĠĠ Ġe fab Animations Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġgroup Animations Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġopen Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġclose When Ab le Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfab Option Already Clicked Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAt tempts Ġto Ġclose Ġthe ĠExpand able Fab , Ġplaying Ġthe Ġappropriate Ġanimations Ġin Ġthe Ġprocess . ĠIf ĊĠĠĠĠ Ġ* Ġthe ĠExpand able Fab Ġis Ġnot Ġin Ġa Ġposition Ġto Ġclose Ġ( it 's Ġstill Ġplaying Ġits Ġopening ĊĠĠĠĠ Ġ* Ġanimations ), Ġit Ġwill Ġrem ind Ġitself Ġto Ġclose Ġonce Ġit Ġis Ġable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠSafe Ġto Ġcall Ġeven Ġwhen Ġno ĠExpand able Fab Ġis Ġopen Ġ( will Ġdo Ġnothing ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġclose (){ ĊĠĠĠĠĠĠĠ Ġif (! animations Finished ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose When Ab le Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif (! open ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup Animations Finished Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġget Closing Animations ( getCurrent Configuration ()). apply Ġ{ Ġstart () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe ĠExpand able Fab Ġis Ġcurrently Ġopen Ġ( any Ġattached ĠOverlay , ĠF ab Option Ġand ĊĠĠĠĠ Ġ* ĠLabels Ġare Ġvisible Ġand Ġall Ġanimations Ġare Ġdone ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun ĠisOpen (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġopen ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe ĠOrientation Configuration Ġshowing Ġfor Ġthe Ġcurrent Ġscreen Ġorientation . ĊĠĠĠĠ Ġ* ĠAn ĠOrientation Configuration Ġis Ġjust Ġa Ġholder Ġfor Ġall Ġthe Ġviews Ġof Ġan ĠExpand able Fab Ġwidget ĊĠĠĠĠ Ġ* Ġin Ġa Ġspecific Ġ[ Orientation ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠShould Ġonly Ġbe Ġcalled Ġafter Ġyou Ġhave Ġadded Ġthe Ġviews Ġto Ġan ĠExpand able Fab Layout ĊĠĠĠĠ Ġ* Ġprogram matically Ġvia Ġthe Ġadd View Ġmethods , Ġor Ġdeclared Ġthem Ġwithin Ġan ĠExpand able Fab Layout ĊĠĠĠĠ Ġ* Ġvia ĠXML . ĠOtherwise , Ġthe Ġviews Ġcontained Ġmay Ġbe Ġnull Ġfor Ġreferences Ġor Ġempty Ġfor Ġlists . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlthough Ġthe Ġ[ portrait Configuration ] Ġand Ġ[ land scape Configuration ] Ġproperties Ġare Ġboth Ġexposed ĊĠĠĠĠ Ġ* Ġpublicly Ġfor Ġclients Ġto Ġobtain Ġdirectly , Ġthis Ġmethod Ġallows Ġyou Ġto Ġretrieve Ġthe Ġcorrect ĊĠĠĠĠ Ġ* Ġset Ġof Ġviews Ġwithout Ġfirst Ġknowing Ġwhat Ġscreen Ġorientation Ġthe Ġdevice Ġis Ġcurrently Ġin . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠThis Ġmethod Ġwill Ġautomatically Ġtake Ġinto Ġaccount Ġorient ations Ġwith Ġno Ġconfiguration ĊĠĠĠĠ Ġ* Ġset . ĠThat Ġis , Ġif Ġyou Ġonly Ġset Ġa Ġpor trait Ġconfiguration , Ġthen Ġthis Ġmethod Ġwill Ġpass Ġback ĊĠĠĠĠ Ġ* Ġthat Ġconfiguration Ġeven Ġif Ġthe Ġdevice Ġis Ġcurrently Ġin Ġlandscape . ĠYou Ġdon 't Ġhave Ġto Ġworry ĊĠĠĠĠ Ġ* Ġabout Ġbeing Ġgiven Ġan ĠOrientation Configuration Ġfor Ġan Ġorientation Ġthat Ġyou Ġdid Ġnot Ġset . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun ĠgetCurrent Configuration (): ĠOrientation Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( resources . configuration . orientation ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfiguration . OR IENTATION _ POR TRA IT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( portrait Configuration . ef ab Ġ!= Ġnull ) Ġpor trait Configuration Ġelse Ġlandscape Configuration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif ( land scape Configuration . ef ab Ġ!= Ġnull ) Ġlandscape Configuration Ġelse Ġpor trait Configuration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// Ġ***************** * ĠPrivate Ġ/ ĠInternal Ġmethods Ġnot Ġavailable Ġto Ġclients Ġ***************** ** Ġ\\ ĊĠĠĠ Ġprivate Ġfun Ġadd Overlay ( ĊĠĠĠĠĠĠĠ Ġchild : ĠView ?, ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġparams : ĠViewGroup . LayoutParams ? ĊĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠ Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġoverlay Ġ= Ġ( child Ġas ĠOverlay ). also Ġ{ Ġit . default OnClick Behavior Ġ= Ġ:: default Overlay OnClick Behavior Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen ( overlay . orientation ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . POR TRA IT Ġ-> Ġpor trait Configuration . overlay Ġ= Ġoverlay ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LAND SC APE Ġ-> Ġlandscape Configuration . overlay Ġ= Ġoverlay ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Expand able Fab ( ĊĠĠĠĠĠĠĠ Ġchild : ĠView ?, ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġparams : ĠViewGroup . LayoutParams ? ĊĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠ Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġe fab Ġ= Ġ( child Ġas ĠExpand able Fab ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . default OnClick Behavior Ġ= Ġ:: default Expand able Fab OnClick Behavior ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . on Animation Start Ġ= Ġ{ Ġe fab Animations Finished Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġanchor ing Ġthe Ġlabel Ġto Ġits ĠExpand able Fab Ġand Ġadding Ġit Ġto Ġthe ĠExpand able Fab Layout ĊĠĠĠĠĠĠĠ Ġe fab . label . let Ġ{ Ġlabel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( label ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( label . layout Params Ġas ĠLayout Params ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . anchor Id Ġ= Ġe fab . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . layout Params Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . show Label () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen ( ef ab . orientation ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . POR TRA IT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( portrait Configuration . ef ab Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġillegal State ( resources . getString ( R . string . ef ab _ layout _ multiple _ ef abs , Ġe fab . orientation )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpor trait Configuration . ef ab Ġ= Ġe fab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġpor trait Ġe fab Ġwill Ġshow Ġif Ġwe 're Ġin Ġpor trait Ġorientation ĠOR Ġif Ġwe 're Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlandscape , Ġbut Ġno Ġlandscape Ġe fab Ġhas Ġbeen Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( resources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ POR TRA IT ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlandscape Configuration . ef ab ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( land scape Configuration . ef ab Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LAND SC APE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( land scape Configuration . ef ab Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġillegal State ( resources . getString ( R . string . ef ab _ layout _ multiple _ ef abs , Ġe fab . orientation )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlandscape Configuration . ef ab Ġ= Ġe fab ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . show () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġlandscape Ġe fab Ġwill Ġshow Ġif Ġwe 're Ġin Ġlandscape Ġorientation ĠOR Ġif Ġwe 're Ġin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpor trait , Ġbut Ġno Ġpor trait Ġe fab Ġhas Ġbeen Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( resources . configuration . orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpor trait Configuration . ef ab ?. hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif ( portrait Configuration . ef ab Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . hide () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Fab Option ( ĊĠĠĠĠĠĠĠ Ġchild : ĠView ?, ĊĠĠĠĠĠĠĠ Ġindex : ĠInt , ĊĠĠĠĠĠĠĠ Ġparams : ĠViewGroup . LayoutParams ? ĊĠĠĠ Ġ){ ĊĠĠĠĠĠĠĠ Ġsuper . addView ( child , Ġindex , Ġparams ) ĊĠĠĠĠĠĠĠ Ġval Ġfab Option Ġ= Ġ( child Ġas ĠF ab Option ). also Ġ{ Ġit . default OnClick Behavior Ġ= Ġ:: default Fab Option OnClick Behavior Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġwhen ( fab Option . orientation ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . POR TRA IT Ġ-> Ġpor trait Configuration ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LAND SC APE Ġ-> Ġlandscape Configuration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġanchor ing Ġthe Ġlabel Ġto Ġits Ġfab Option Ġand Ġadding Ġit Ġto Ġthe ĠExpand able Fab Layout ĊĠĠĠĠĠĠĠ Ġfab Option . label . let Ġ{ Ġlabel Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd View ( label ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( label . layout Params Ġas ĠLayout Params ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . anchor Id Ġ= Ġfab Option . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabel . layout Params Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconfiguration . fab Options . add ( fab Option ) ĊĠĠĠĠĠĠĠ Ġconfiguration . set Fab Option Anchor ( fab Option , Ġconfiguration . fab Options . last Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault Overlay OnClick Behavior () Ġ{ ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault Expand able Fab OnClick Behavior (){ ĊĠĠĠĠĠĠĠ Ġif ( open Ġ|| Ġ! animations Finished ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthe ĠF ab Option Ġshould Ġrun Ġits Ġcustom ĠonClick Ġlistener Ġ( only Ġwhen Ġno Ġother ĊĠĠĠĠ Ġ* ĠF ab Option Ġhas Ġbeen Ġclicked Ġduring Ġthe Ġcurrently Ġplaying Ġopening / closing Ġanimations ). ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdefault Fab Option OnClick Behavior (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( fab Option Already Clicked ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab Option Already Clicked Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen (){ ĊĠĠĠĠĠĠĠ Ġif ( open ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgroup Animations Finished Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġget Opening Animations ( getCurrent Configuration ()). apply Ġ{ Ġstart () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Opening Animations ( configuration : ĠOrientation Configuration ): ĠAn imator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe fab Ġ= Ġconfiguration . ef ab Ġas ĠExpand able Fab ĊĠĠĠĠĠĠĠ Ġval Ġoption And Label Animation Pairs Ġ= Ġconfiguration . fab Options . map Indexed Ġ{ Ġindex , Ġfab Option Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfab Option . opening Animations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . fab Option Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . fab Option Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . first Fab Option Margin Px , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . success ive Fab Option Margin Px ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAn imator Set (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay To gether ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . overlay ?. opening Animations () Ġ?: ĠAn imator Set (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . opening Animations Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab Animations Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAn imator Set (). apply Ġ{ Ġplay Se quent ially ( option And Label Animation Pairs ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( setState As Opened ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Closing Animations ( configuration : ĠOrientation Configuration ): ĠAn imator Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe fab Ġ= Ġconfiguration . ef ab Ġas ĠExpand able Fab ĊĠĠĠĠĠĠĠ Ġval Ġoption And Label Animation Pairs Ġ= Ġconfiguration . fab Options . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . closing Animations () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAn imator Set (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplay To gether ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . overlay ?. closing Animations () Ġ?: ĠAn imator Set (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab . closing Animations Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe fab Animations Finished Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetState ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAn imator Set (). apply Ġ{ Ġplay Se quent ially ( option And Label Animation Pairs . reversed ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Listener ( setState As Closed ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTell s Ġus Ġwhether Ġall Ġanimations Ġare Ġfinished . Ġ[ Expand able Fab ] Ġis Ġunique Ġin Ġthat Ġit ĊĠĠĠĠ Ġ* Ġperforms Ġits Ġanimations Ġmanually , Ġwithout Ġuse Ġof Ġan ĠAn imator Ġ( un like Ġthe Ġother Ġviews ĊĠĠĠĠ Ġ* Ġwithin Ġthis Ġwidget ). ĠSo Ġthe ĠExpand able Fab Layout Ġessentially Ġhas Ġto Ġkeep Ġtrack Ġof Ġtwo ĊĠĠĠĠ Ġ* Ġseparate Ġsets Ġof Ġanimations : Ġ 1 ) Ġmanual Ġanimations Ġon Ġthe Ġcurrently Ġshown ĠExpand able Fab , ĊĠĠĠĠ Ġ* Ġand Ġ 2 ) ĠAn imator Ġanimations Ġof Ġthe ĠOverlay , ĠF ab Option Ġand Ġall ĠLabels , Ġgrouped Ġtogether . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġwill Ġonly Ġreturn Ġtrue Ġif ĠBOT H Ġsets Ġof Ġanimations Ġare Ġfinished Ġrunning . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġanimations Finished (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġe fab Animations Finished Ġ&& Ġgroup Animations Finished ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġstate Ġnecessary Ġto Ġshow Ġthat Ġthe ĠExpand able Fab Ġis Ġnow Ġfully Ġopened Ġ( opening ĊĠĠĠĠ Ġ* Ġanimations Ġare Ġfinished Ġplaying Ġand Ġall Ġviews Ġof Ġthe Ġwidget Ġare Ġvisible ) Ġor Ġfully Ġclosed ĊĠĠĠĠ Ġ* Ġ( closing Ġanimations Ġare Ġfinished Ġplaying Ġand Ġall Ġviews Ġof Ġthe Ġwidget Ġare Ġhidden ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAs Ġstated Ġin Ġ[ animations Finished ], Ġwe Ġhave Ġto Ġtrack Ġtwo Ġseparate Ġsets Ġof Ġanimations ĊĠĠĠĠ Ġ* Ġbecause Ġthe Ġanimations Ġperformed Ġon Ġthe Ġ[ Expand able Fab ] Ġare Ġunique Ġand Ġdon 't Ġuse Ġan ĠAn imator ĊĠĠĠĠ Ġ* Ġlike Ġthe Ġother Ġwidget Ġviews . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġtwo Ġsets Ġof Ġanimations Ġare : ĊĠĠĠĠ Ġ* Ġ 1 ) ĠManual Ġanimations Ġon Ġthe Ġcurrently Ġshown ĠExpand able Fab , Ġand ĊĠĠĠĠ Ġ* Ġ 2 ) Ġ[ Animator ] Ġanimations Ġof Ġthe ĠOverlay , ĠF ab Option Ġand Ġall ĠLabels , Ġgrouped Ġtogether ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBoth Ġsets Ġof Ġanimations Ġwill Ġcall Ġthis Ġmethod Ġwhen Ġtheir Ġrespective Ġanimations Ġhave ĊĠĠĠĠ Ġ* Ġfinished Ġplaying . ĠHowever , Ġthis Ġmethod Ġwill Ġonly Ġactually Ġset Ġthe Ġstate Ġof Ġthe Ġwidget Ġas ĊĠĠĠĠ Ġ* Ġopened Ġor Ġclosed Ġwhen Ġit Ġcan Ġdetermine Ġboth Ġsets Ġof Ġanimations Ġhave Ġfinished . ĠIn Ġother ĊĠĠĠĠ Ġ* Ġwords , Ġonly Ġthe Ġcall Ġfrom Ġthe Ġlonger Ġ( duration Ġwise ) Ġof Ġthe Ġtwo Ġanimations Ġwill Ġactually ĊĠĠĠĠ Ġ* Ġtrigger Ġthe Ġstate Ġto Ġchange . ĠSo Ġseeing Ġthis Ġcalled Ġtwice Ġper Ġcall Ġto Ġopen / close Ġis Ġexpected . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠsetState ( opened : ĠBoolean ){ ĊĠĠĠĠĠĠĠ Ġif ( animations Finished ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( opened ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( close When Ab le ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose When Ab le Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab Option Already Clicked Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠsetState As Opened Ġ= Ġobject Ġ: ĠAn imator Listener Adapter (){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Animations Finished Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState ( true ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar ĠsetState As Closed Ġ= Ġobject Ġ: ĠAn imator Listener Adapter (){ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup Animations Finished Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetState ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }