package Ġcom . ro ac ult . backdrop Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ Ċ class ĠBack drop Layout Ġ@ Jvm Over loads Ġconstructor ( context : ĠContext , Ġattribute Ġ: ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt Ġ= Ġ 0 ) ĊĠĠĠ Ġ: ĠFrame Layout ( context , attribute , def Style Attr ){ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġset Ġpeek Ġheight ĊĠĠĠĠ Ġ* Ġthis Ġshould Ġbe Ġthe Ġheight Ġof Ġfront Ġlayout ĊĠĠĠĠ Ġ* Ġheader ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġvar Ġp ee ck Height Ġ= Ġ 0 F ĊĠĠĠ Ġvar Ġfront Layout Id Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġback Layout Id Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġtoolbar Id Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġfront Layout Ġ: ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfront Layout Disabled : View ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġback Layout Ġ: ĠView ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtoolbar Ġ: ĠToolbar ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdisable When Opened Ġ Ġ= Ġtrue ĊĠĠĠ Ġvar Ġmenu Icon Ġ: ĠInt Ġ= ĠR . drawable . menu ĊĠĠĠ Ġvar Ġclose Icon Ġ: ĠInt Ġ= ĠR . drawable . close ĊĠĠĠ Ġvar Ġduration ĠĠ Ġ= ĠDEFAULT _ DURATION ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġcallback Ġ: Ġwill Ġbe Ġcalled Ġwhen Ġever ĊĠĠĠĠ Ġ* Ġback drop Ġlayout Ġchange Ġhis Ġstate ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġon Back drop Change State Listener Ġ: Ġ(( State ) Ġ-> ĠUnit )? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġstate Ġ: ĠState Ġ= ĠState . CLOSE ĊĊĠĠĠ Ġprivate Ġval Ġanim ator Ġ= Ġ ĠValue Animator () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠO LD _ PAR CE Ġ=" old Par ce " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠSTATE Ġ= Ġ Ġ" Back Drop State " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠDEFAULT _ DURATION Ġ= Ġ 4 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠState Ġ{ ĊĠĠĠĠĠĠĠ ĠOPEN , CLOSE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState (): ĠParcel able ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġsuper . on Save InstanceState () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Parcelable ( OLD _ PAR CE , p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Serializable ( STATE , state ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( state : ĠParcel able ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbundle Ġ= Ġstate Ġas ĠBundle ĊĠĠĠĠĠĠĠ Ġbundle . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( bundle . get Parcelable ( OLD _ PAR CE )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Back drop Layout . state Ġ= Ġget Serializable ( STATE ) Ġas ĠState ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpost Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate ( false ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtyped Array Ġ= Ġcontext . obtain Styled Attributes ( attribute , ĠR . style able . Back drop Layout ) ĊĠĠĠĠĠĠĠ Ġfront Layout Id Ġ= Ġtyped Array . getResource Id ( R . style able . Back drop Layout _ front _ layout , 0 ) ĊĠĠĠĠĠĠĠ Ġback Layout Id Ġ= Ġtyped Array . getResource Id ( R . style able . Back drop Layout _ back _ layout , 0 ) ĊĊĠĠĠĠĠĠĠ Ġif ( front Layout Id Ġ== Ġ 0 Ġ|| Ġback Layout Id Ġ== 0 Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" you Ġshould Ġprovide Ġboth Ġfront Ġand Ġback Ġlayout Ġin Ġxml Ġfile ") ĊĊĠĠĠĠĠĠĠ Ġp ee ck Height Ġ= Ġtyped Array . get Dimension ( R . style able . Back drop Layout _ peek Height , 0 F ) ĊĠĠĠĠĠĠĠ Ġtoolbar Id Ġ= Ġtyped Array . getResource Id ( R . style able . Back drop Layout _ toolbar Id , 0 ) ĊĠĠĠĠĠĠĠ Ġmenu Icon Ġ= Ġtyped Array . getResource Id ( R . style able . Back drop Layout _ menu Drawable , R . drawable . menu ) ĊĠĠĠĠĠĠĠ Ġdisable When Opened Ġ= Ġtyped Array . getBoolean ( R . style able . Back drop Layout _ disable _ when _ open Ġ, Ġtrue ) ĊĠĠĠĠĠĠĠ Ġclose Icon Ġ= Ġtyped Array . getResource Id ( R . style able . Back drop Layout _ close Drawable , R . drawable . close ) ĊĠĠĠĠĠĠĠ Ġduration Ġ= Ġtyped Array . getInteger ( R . style able . Back drop Layout _ animation Duration , ĠDEFAULT _ DURATION ) ĊĊĠĠĠĠĠĠĠ Ġtyped Array . recycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġopen Ġ: Ġshow Ġback Ġlayout Ġand Ġswap Ġfront Ġlayout ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġopen () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( state Ġ== ĠState . OPEN ) Ġreturn ĊĠĠĠĠĠĠĠ Ġstate Ġ= ĠState . OPEN ĊĠĠĠĠĠĠĠ Ġif ( disable When Opened ) Ġdisable F ron View () ĊĠĠĠĠĠĠĠ Ġupdate ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġclose Ġ: Ġhide Ġback Ġlayout Ġand Ġswap Ġfront Ġlayout ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġclose (){ ĊĠĠĠĠĠĠĠ Ġif ( state == ĠState . CLOSE ) Ġreturn ĊĠĠĠĠĠĠĠ Ġstate = ĠState . CLOSE ĊĠĠĠĠĠĠĠ Ġif ( disable When Opened ) Ġenable Front View () ĊĠĠĠĠĠĠĠ Ġupdate ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġchange Ġstate Ġof Ġback drop Ġlayout ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġswitch () Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( state Ġ== ĠState . OPEN ) Ġclose () ĊĠĠĠĠĠĠĠ Ġelse Ġopen () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġsetter Ġfor Ġback drop Change State Listener ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġset On Back drop Change State Listener ( listener Ġ: Ġ(( State ) Ġ-> ĠUnit )? ){ ĊĠĠĠĠĠĠĠ Ġon Back drop Change State Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate ( with Animation Ġ: ĠBoolean ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġon Back drop Change State Listener ?. invoke ( state ) ĊĊĠĠĠĠĠĠĠ Ġwhen ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . OPEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Toolbar ()?. set Navigation Icon ( close Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransition Height Ġ= Ġget Transition Height () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( with Animation ) Ġstart Translate Animation ( transition Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Front Layout (). translation Y Ġ= Ġtransition Height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . CLOSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Toolbar ()?. set Navigation Icon ( menu Icon ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( with Animation ) Ġstart Translate Animation ( 0 F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget Front Layout (). translation Y Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Attached To Window () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Attached To Window () ĊĠĠĠĠĠĠĠ Ġget Toolbar ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigation Icon ( Ġif ( state Ġ== ĠState . CLOSE ) Ġmenu Icon Ġelse Ġclose Icon Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġswitch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Front Layout () Ġ: ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( front Layout Ġ!= Ġnull Ġ) Ġreturn Ġfront Layout !! ĊĠĠĠĠĠĠĠ Ġfront Layout Ġ= ĠfindViewById ( front Layout Id ) Ġ?: Ġthrow ĠException (" please Ġprovide Ġa Ġvalid Ġid Ġfor Ġfront Ġlayout ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfront Layout !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Back Layout () Ġ: ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( back Layout Ġ!= Ġnull ) Ġreturn Ġback Layout !! ĊĠĠĠĠĠĠĠ Ġback Layout Ġ= ĠfindViewById ( back Layout Id ) Ġ?: Ġthrow ĠException (" please Ġprovide Ġa Ġvalid Ġid Ġfor Ġback Ġlayout ") ĊĠĠĠĠĠĠĠ Ġreturn Ġback Layout !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Toolbar () Ġ: ĠToolbar ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( toolbar Ġ!= Ġnull ) Ġreturn Ġtoolbar ĊĠĠĠĠĠĠĠ Ġelse Ġif ( toolbar Id Ġ== Ġ 0 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġtoolbar Ġ= Ġroot View . findViewById ( toolbar Id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtoolbar ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Translate Animation Ġ( to : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanim ator . pause () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanim ator . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Float Values ( get Front Layout (). translation Y , to ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġthis @ Back drop Layout . duration . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Front Layout (). translation Y Ġ= Ġit . animated Value Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Transition Height (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠMath . min ( get Back Layout (). height . toFloat (), height Ġ- Ġp ee ck Height ) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġdisable F ron View (){ ĊĠĠĠĠĠĠĠ Ġval Ġfront Layout Ġ= Ġget Front Layout () ĊĠĠĠĠĠĠĠ Ġupdate Front View ( front Layout Ġ, Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Front View (){ ĊĠĠĠĠĠĠĠ Ġval Ġfront Layout Ġ= Ġget Front Layout () ĊĠĠĠĠĠĠĠ Ġupdate Front View ( front Layout Ġ, Ġtrue ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate Front View ( front View Ġ: View Ġ, Ġenable : Boolean Ġ){ ĊĠĠĠĠĠĠĠ Ġif ( Ġfront View Ġis ĠViewGroup ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Front View Child s ( front View Ġ, Ġenable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfront View . isEnabled Ġ= Ġenable ĊĠĠĠĠĠĠĠ Ġget Front Layout (). alpha Ġ= if ( enable ) Ġ 1 . 0 f Ġelse Ġ 0 . 9 5 f ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate Front View Child s ( layout : ViewGroup Ġ, Ġenable : Boolean Ġ){ ĊĠĠĠĠĠĠĠ Ġfor Ġ( Ġi Ġin Ġ 0 Ġuntil Ġlayout . child Count ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . getChild At ( i ). isEnabled Ġ= Ġenable ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }