package Ġru . semp er _ viv ent em . backdrop Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Parcelable Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . annotation . Id Res Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . coordinator layout . widget . Coordinator Layout ĊĊ Ċ class ĠBack drop Behavior Ġ: ĠCoord inator Layout . Behavior < View > Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠDrop State Ġ{ ĊĠĠĠĠĠĠĠ ĠOPEN , ĊĠĠĠĠĠĠĠ ĠCLOSE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠOn Drop Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġon Drop ( drop State : ĠDrop State , Ġfrom User : ĠBoolean ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ DURATION Ġ= Ġ 3 0 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠWITHOUT _ DURATION Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ DROP _ STATE Ġ= ĠDrop State . CLOSE ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠARG _ DROP _ STATE Ġ= Ġ" arg _ drop _ state " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġutils Ġ= ĠBack drop Utils () ĊĊĠĠĠ Ġprivate Ġvar Ġtoolbar Id : ĠInt ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġback Layout Id : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġtoolbar : ĠToolbar ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġback Layout : ĠViewGroup ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfront Layout : ĠView ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġclosed Icon Id : ĠInt Ġ= ĠR . drawable . ic _ menu ĊĠĠĠ Ġprivate Ġvar Ġopened Icon Res : ĠInt Ġ= ĠR . drawable . ic _ close ĊĊĠĠĠ Ġprivate Ġvar Ġdrop State : ĠDrop State Ġ= ĠDEFAULT _ DROP _ STATE ĊĊĠĠĠ Ġprivate Ġvar Ġneed To Initializing Ġ= Ġtrue ĊĊĠĠĠ Ġprivate Ġvar Ġdrop Listeners Ġ= Ġmutable ListOf < On Drop Listener >() ĊĊĠĠĠ Ġconstructor () Ġ: Ġsuper () ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( parent : ĠCoord inator Layout , Ġchild : ĠView ): ĠParcel able Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBundle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Serializable ( ARG _ DROP _ STATE , Ġdrop State ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( parent : ĠCoord inator Layout , Ġchild : ĠView , Ġstate : ĠParcel able ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( parent , Ġchild , Ġstate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrop State Ġ= Ġ( state Ġas ? ĠBundle )?. get Serializable ( ARG _ DROP _ STATE ) Ġas ? ĠDrop State Ġ?: ĠDEFAULT _ DROP _ STATE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlayout Dep ends On ( parent : ĠCoord inator Layout , Ġchild : ĠView , Ġdependency : ĠView ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( toolbar Id Ġ== Ġnull Ġ&& Ġback Layout Id Ġ== Ġnull ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( dependency . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar Id Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Layout Id Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Dependent View Changed ( parent : ĠCoord inator Layout , Ġchild : ĠView , Ġdependency : ĠView ): ĠBoolean Ġ{ ĊĊĠĠĠĠĠĠĠ Ġthis . front Layout Ġ= Ġchild Ġas ? ĠViewGroup Ġ?: Ġthrow ĠIllegalArgumentException (" Back Layout Ġmust Ġextend Ġa ĠViewGroup ") ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( dependency . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar Id Ġ-> Ġtoolbar Ġ= Ġdependency Ġas ? ĠToolbar Ġ?: Ġthrow ĠIllegalArgumentException (" toolbar Id Ġdoesn 't Ġmatch ĠToolbar ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Layout Id Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġback Layout Ġ= Ġdependency Ġas ? ĠViewGroup Ġ?: Ġthrow ĠIllegalArgumentException (" back Layout Id Ġdoesn 't Ġmatch Ġback ĠLayout ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ( next Ġrelease ): Ġremove Ġthis Ġconditional ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( toolbar Id Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar Ġ= Ġutils . find Toolbar ( back Layout !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" AppBar Layout Ġm ast Ġcontain Ġa ĠToolbar !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( toolbar Ġ!= Ġnull Ġ&& Ġfront Layout Ġ!= Ġnull Ġ&& Ġback Layout Ġ!= Ġnull Ġ&& Ġneed To Initializing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Views ( parent , Ġfront Layout !! , Ġtoolbar !! , Ġback Layout !! ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Dependent View Changed ( parent , Ġchild , Ġdependency ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Opened Icon (@ Id Res Ġicon Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . opened Icon Res Ġ= Ġicon Res ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Closed Icon (@ Id Res Ġicon Res : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . closed Icon Id Ġ= Ġicon Res ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAttach Ġback Ġlayout Ġto ĠBack drop . ĊĠĠĠĠ Ġ* ĠBack Drop Layout Ġmust Ġcontain Ġa Ġ[ Toolbar ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġattach Back Layout (@ Id Res Ġapp Bar Layout Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . back Layout Id Ġ= Ġapp Bar Layout Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ deprecated ĠâĢĶ Ġuse Ġ[ Back drop Behavior . attach Back Layout ]. ĠThis Ġmethod Ġwill Ġbe Ġremoved Ġin Ġversion Ġ 0 . 1 . 7 + ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" Use ĠBack drop Behavior . attach Back Layout ") ĊĠĠĠ Ġfun Ġattach Toolbar (@ Id Res Ġtoolbar Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . toolbar Id Ġ= Ġtoolbar Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ deprecated ĠâĢĶ Ġuse Ġ[ Back drop Behavior . attach Back Layout ]. ĠThis Ġmethod Ġwill Ġbe Ġremoved Ġin Ġversion Ġ 0 . 1 . 7 + ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated (" Use ĠBack drop Behavior . attach Back Layout ") ĊĠĠĠ Ġfun Ġattach Back Container (@ Id Res Ġback Container Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . back Layout Id Ġ= Ġback Container Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Drop Listener ( listener : ĠOn Drop Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Drop Listener ( listener : ĠOn Drop Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop Listeners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen ( with Animation : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ= Ġif Ġ( drop State Ġ== ĠDrop State . OPEN ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop State Ġ= ĠDrop State . OPEN ĊĠĠĠĠĠĠĠ Ġif Ġ( back Layout Ġ!= Ġnull Ġ&& Ġtoolbar Ġ!= Ġnull Ġ&& Ġfront Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Drop State ( front Layout !! , Ġtoolbar !! , Ġback Layout !! , Ġwith Animation ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Toolbar Ġand Ġback Container Ġmust Ġbe Ġinitialized ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Listeners ( false ) ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose ( with Animation : ĠBoolean Ġ= Ġtrue ): ĠBoolean Ġ= Ġif Ġ( drop State Ġ== ĠDrop State . CLOSE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop State Ġ= ĠDrop State . CLOSE ĊĠĠĠĠĠĠĠ Ġif Ġ( back Layout Ġ!= Ġnull Ġ&& Ġtoolbar Ġ!= Ġnull Ġ&& Ġfront Layout Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Drop State ( front Layout !! , Ġtoolbar !! , Ġback Layout !! , Ġwith Animation ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Toolbar Ġand Ġback Container Ġmust Ġbe Ġinitialized ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotify Listeners ( false ) ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Views ( parent : ĠCoord inator Layout , Ġfront Layout : ĠView , Ġtoolbar : ĠToolbar , Ġback Layout : ĠView ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ( next Ġrelease ): Ġremove Ġthis Ġblock ĊĠĠĠĠĠĠĠ Ġif Ġ( toolbar Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Layout . y Ġ= Ġtoolbar . y Ġ+ Ġtoolbar . height ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfront Layout . layout Params . height Ġ= Ġparent . height Ġ- Ġcalculate Top Position ( back Layout , Ġtoolbar ). toInt () ĊĠĠĠĠĠĠĠ Ġdraw Drop State ( front Layout , Ġtoolbar , Ġback Layout , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġwith ( toolbar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Navigation OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdrop State Ġ= Ġwhen Ġ( drop State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrop State . CLOSE Ġ-> ĠDrop State . OPEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDrop State . OPEN Ġ-> ĠDrop State . CLOSE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Drop State ( front Layout , Ġtoolbar , Ġback Layout ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listeners ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġneed To Initializing Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Drop State ( front Layout : ĠView , Ġtoolbar : ĠToolbar , Ġback Container : ĠView , Ġwith Animation : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( drop State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrop State . CLOSE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Closed State ( front Layout , Ġback Container , Ġtoolbar , Ġwith Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar . set Navigation Icon ( closed Icon Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDrop State . OPEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Opened State ( front Layout , Ġback Container , Ġwith Animation ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoolbar . set Navigation Icon ( opened Icon Res ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Closed State ( front Layout : ĠView , Ġback Layout : ĠView , Ġtoolbar : ĠToolbar , Ġwith Animation : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġcalculate Top Position ( back Layout , Ġtoolbar ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( with Animation ) ĠDEFAULT _ DURATION Ġelse ĠWITHOUT _ DURATION ĊĊĠĠĠĠĠĠĠ Ġfront Layout . animate (). y ( position ). set Duration ( duration ). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdraw Opened State ( front Layout : ĠView , Ġback Layout : ĠView , Ġwith Animation : ĠBoolean Ġ= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġcalculate Bottom Position ( back Layout ) ĊĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġif Ġ( with Animation ) ĠDEFAULT _ DURATION Ġelse ĠWITHOUT _ DURATION ĊĊĠĠĠĠĠĠĠ Ġfront Layout . animate (). y ( position ). set Duration ( duration ). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Top Position ( back Layout : ĠView , Ġtoolbar : ĠToolbar ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠTODO Ġ( next Ġrelease ): Ġremove Ġthis Ġblock ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( toolbar Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġback Layout . y ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( back Layout . y Ġ+ Ġtoolbar . y Ġ+ Ġtoolbar . height ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Bottom Position ( back Layout : ĠView ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġback Layout . y Ġ+ Ġback Layout . height ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnotify Listeners ( from User : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrop Listeners . forEach Ġ{ Ġlistener Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . on Drop ( drop State , Ġfrom User ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }