/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . material st udies . reply . ui . nav Ċ Ċ import Ġandroid . animation . Value Animator Ċ import Ġandroid . content . res . Color State List Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . Frame Layout Ċ import Ġandroidx . activity . On Back Pressed Callback Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . observe Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior . STATE _ COLL AP SED Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior . STATE _ EXP AN DED Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior . STATE _ HALF _ EXP AN DED Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior . STATE _ HIDDEN Ċ import Ġcom . google . android . material . bottom sheet . Bottom Sheet Behavior . from Ċ import Ġcom . google . android . material . shape . Material Shape Drawable Ċ import Ġcom . material st udies . reply . R Ċ import Ġcom . material st udies . reply . data . Account Ċ import Ġcom . material st udies . reply . data . Account Store Ċ import Ġcom . material st udies . reply . databinding . Fragment Bottom Nav Drawer Binding Ċ import Ġcom . material st udies . reply . util . lerp Ċ import Ġcom . material st udies . reply . util . theme Color Ċ import Ġcom . material st udies . reply . util . theme Interpolator Ċ import Ġkotlin . Lazy Thread Safety Mode . NONE Ċ import Ġkotlin . math . abs Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Fragment ] Ġwhich Ġacts Ġas Ġa Ġbottom Ġnavigation Ġdrawer . Ċ Ġ*/ Ċ class ĠBottom Nav Drawer Fragment Ġ: ĊĠĠĠ ĠFragment (), ĊĠĠĠ ĠNavigation Adapter . Navigation Adapter Listener , ĊĠĠĠ ĠAccount Adapter . Account Adapter Listener Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEnumeration Ġof Ġstates Ġin Ġwhich Ġthe Ġaccount Ġpicker Ġcan Ġbe Ġin . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġenum Ġclass ĠSand wich State Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġaccount Ġpicker Ġis Ġnot Ġvisible . ĠThe Ġnavigation Ġdrawer Ġis Ġin Ġits Ġdefault Ġstate . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠCLO SED , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġaccount Ġpicker Ġis Ġvisible Ġand Ġopen . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠOPEN , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġaccount Ġpicker Ġs and wich ing Ġanimation Ġis Ġrunning . ĠThe Ġaccount Ġpicker Ġis Ġneither Ġopen ĊĠĠĠĠĠĠĠĠ Ġ* Ġnor Ġclosed . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠSET TL ING ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbinding : ĠFragment Bottom Nav Drawer Binding ĊĊĠĠĠ Ġprivate Ġval Ġbehavior : ĠBottom Sheet Behavior < Frame Layout > Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfrom ( binding . background Container ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbottom Sheet Callback Ġ= ĠBottom Navigation Drawer Callback () ĊĊĠĠĠ Ġprivate Ġval Ġs and wich Slide Actions Ġ= Ġmutable ListOf < On Sand wich Slide Action >() ĊĊĠĠĠ Ġprivate Ġval Ġnavigation Listeners : ĠMutable List < Navigation Adapter . Navigation Adapter Listener > Ġ= ĊĠĠĠĠĠ Ġmutable ListOf () ĊĊĠĠĠ Ġprivate Ġval Ġbackground Shape Drawable : ĠMaterial Shape Drawable Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbackground Context Ġ= Ġbinding . background Container . context ĊĠĠĠĠĠĠĠ ĠMaterial Shape Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . attr . bottom Sheet Style , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= ĠColor State List . valueOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Context . theme Color ( R . attr . color Primary Surface Variant ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġresources . get Dimension ( R . dim en . plane _ 0 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Elevation Overlay ( require Context ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġforeground Shape Drawable : ĠMaterial Shape Drawable Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġforeground Context Ġ= Ġbinding . foreground Container . context ĊĠĠĠĠĠĠĠ ĠMaterial Shape Drawable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . attr . bottom Sheet Style , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Color Ġ= ĠColor State List . valueOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Context . theme Color ( R . attr . color Primary Surface ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelevation Ġ= Ġresources . get Dimension ( R . dim en . plane _ 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshadow Compatibility Mode Ġ= ĠMaterial Shape Drawable . SH ADOW _ COMPAT _ MODE _ NE VER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitialize Elevation Overlay ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape Appearance Model Ġ= Ġshape Appearance Model . to Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Top Edge ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSemi Circle Edge Cut out T reatment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension ( R . dim en . grid _ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension ( R . dim en . grid _ 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . get Dimension ( R . dim en . navigation _ drawer _ profile _ image _ size _ padded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġs and wich State : ĠSand wich State Ġ= ĠSand wich State . CLOSED ĊĠĠĠ Ġprivate Ġvar Ġs and wich Anim : ĠValue Animator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġs and wich Interp Ġby Ġlazy ( NONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire Context (). theme Interpolator ( R . attr . motion Interpolator Persistent ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġ// ĠProgress Ġvalue Ġwhich Ġdrives Ġthe Ġanimation Ġof Ġthe Ġs and wich ing Ġaccount Ġpicker . ĠResp ons ible ĊĠĠĠ Ġ// Ġfor Ġboth Ġcalling Ġprogress Ġupdates Ġand Ġstate Ġupdates . ĊĠĠĠ Ġprivate Ġvar Ġs and wich Progress : ĠFloat Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field Ġ!= Ġvalue ) Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Sand wich Progress Changed ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= Ġwhen ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 F Ġ-> ĠSand wich State . CLOSED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 F Ġ-> ĠSand wich State . OPEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠSand wich State . SET TL ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sand wich State Ġ!= ĠnewState ) Ġon Sand wich StateChanged ( newState ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs and wich State Ġ= ĠnewState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġclose Drawer On Back Pressed Ġ= Ġobject Ġ: ĠOn Back Pressed Callback ( false ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle On Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġrequire Activity (). on Back Pressed Dispatcher . add Callback ( this , Ġclose Drawer On Back Pressed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠĠĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding Ġ= ĠFragment Bottom Nav Drawer Binding . inflate ( in flater , Ġcontainer , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġbinding . foreground Container . setOn Apply Window Insets Listener Ġ{ Ġview , Ġwindow Insets Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRecord Ġthe Ġwindow 's Ġtop Ġinset Ġso Ġit Ġcan Ġbe Ġapplied Ġwhen Ġthe Ġbottom Ġsheet Ġis Ġslide Ġup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġmeet Ġthe Ġtop Ġedge Ġof Ġthe Ġscreen . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . setTag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . tag _ system _ window _ in set _ top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Insets . system Window Inset Top ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwindow Insets ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbinding . root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Container . background Ġ= Ġbackground Shape Drawable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Container . background Ġ= Ġforeground Shape Drawable ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġs cri m View . setOnClickListener Ġ{ Ġclose () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Sheet Callback . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠS cri m Ġview Ġtransforms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Slide Action ( Alpha Slide Action ( scri m View )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On StateChanged Action ( Visibility State Action ( scri m View )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFore ground Ġtransforms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On Slide Action ( Foreground Sheet Transform Slide Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . foreground Container , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Shape Drawable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . profile ImageView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe cycler Ġtransforms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On StateChanged Action ( Scroll To Top State Action ( nav RecyclerView )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClose Ġthe Ġs and wich ing Ġaccount Ġpicker Ġif Ġopen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On StateChanged Action ( object Ġ: ĠOn StateChanged Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( sheet : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs and wich Anim ?. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs and wich Progress Ġ= Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġdrawer Ġis Ġopen , Ġpressing Ġthe Ġsystem Ġback Ġbutton Ġshould Ġclose Ġthe Ġdrawer . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd On StateChanged Action ( object Ġ: ĠOn StateChanged Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon StateChanged ( sheet : ĠView , ĠnewState : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclose Drawer On Back Pressed . isEnabled Ġ= ĠnewState Ġ!= ĠSTATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . setOnClickListener Ġ{ Ġtoggle Sand wich () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehavior . add Bottom Sheet Callback ( bottom Sheet Callback ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehavior . state Ġ= ĠSTATE _ HIDDEN ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadapter Ġ= ĠNavigation Adapter ( this @ Bottom Nav Drawer Fragment ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav RecyclerView . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Model . navigation List . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadapter . submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNavigation Model . set Navigation MenuItem Checked ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccount Adapter Ġ= ĠAccount Adapter ( this @ Bottom Nav Drawer Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount RecyclerView . adapter Ġ= Ġaccount Adapter ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAccount Store . user Accounts . observe ( view Lifecycle Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Adapter . submit List ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentUser Account Ġ= Ġit . first Ġ{ Ġacc Ġ-> Ġacc . is Current Account Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs and wich State Ġ== ĠSand wich State . OPEN Ġ-> Ġtoggle Sand wich () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehavior . state Ġ== ĠSTATE _ HIDDEN Ġ-> Ġopen () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbehavior . state Ġ== ĠSTATE _ HIDDEN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġbehavior . state Ġ== ĠSTATE _ HALF _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġbehavior . state Ġ== ĠSTATE _ EXP AN DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġbehavior . state Ġ== ĠSTATE _ COLL AP SED Ġ-> Ġclose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġopen () Ġ{ ĊĠĠĠĠĠĠĠ Ġbehavior . state Ġ= ĠSTATE _ HALF _ EXP AN DED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġbehavior . state Ġ= ĠSTATE _ HIDDEN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On Slide Action ( action : ĠOn Slide Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbottom Sheet Callback . add On Slide Action ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd On StateChanged Action ( action : ĠOn StateChanged Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbottom Sheet Callback . add On StateChanged Action ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Navigation Listener ( listener : ĠNavigation Adapter . Navigation Adapter Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Listeners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdd Ġactions Ġto Ġbe Ġrun Ġwhen Ġthe Ġslide Ġoffset Ġ( animation Ġprogress ) Ġor Ġthe Ġs and wich ing Ġaccount ĊĠĠĠĠ Ġ* Ġpicker Ġhas Ġchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd On Sand wich Slide Action ( action : ĠOn Sand wich Slide Action ) Ġ{ ĊĠĠĠĠĠĠĠ Ġs and wich Slide Actions . add ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nav MenuItem Clicked ( item : ĠNavigation Model Item . Nav MenuItem ) Ġ{ ĊĠĠĠĠĠĠĠ ĠNavigation Model . set Navigation MenuItem Checked ( item . id ) ĊĠĠĠĠĠĠĠ Ġclose () ĊĠĠĠĠĠĠĠ Ġnavigation Listeners . forEach Ġ{ Ġit . on Nav MenuItem Clicked ( item ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Nav Email Folder Clicked ( folder : ĠNavigation Model Item . Nav Email Folder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnavigation Listeners . forEach Ġ{ Ġit . on Nav Email Folder Clicked ( folder ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Account Clicked ( account : ĠAccount ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAccount Store . setCurrent User Account ( account . id ) ĊĠĠĠĠĠĠĠ Ġtoggle Sand wich () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen Ġor Ġclose Ġthe Ġaccount Ġpicker Ġ" sand wich ". ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġtoggle Sand wich () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Progress Ġ= Ġs and wich Progress ĊĠĠĠĠĠĠĠ Ġval Ġnew Progress Ġ= Ġwhen Ġ( sand wich State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSand wich State . CLOSED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStore Ġthe Ġoriginal Ġtop Ġlocation Ġof Ġthe Ġbackground Ġcontainer Ġso Ġwe Ġcan Ġanimate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġdelta Ġbetween Ġits Ġoriginal Ġtop Ġposition Ġand Ġthe Ġtop Ġposition Ġneeded Ġto Ġjust ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġshow Ġthe Ġaccount Ġpicker ĠRecyclerView , Ġand Ġback Ġagain . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . background Container . setTag ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . tag _ view _ top _ snapshot , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . background Container . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 F ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSand wich State . OPEN Ġ-> Ġ 0 F ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSand wich State . SET TL ING Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs and wich Anim ?. cancel () ĊĠĠĠĠĠĠĠ Ġs and wich Anim Ġ= ĠValue Animator . of Float ( initial Progress , Ġnew Progress ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Update Listener Ġ{ Ġs and wich Progress Ġ= Ġanimated Value Ġas ĠFloat Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinterpol ator Ġ= Ġs and wich Interp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġ( abs ( new Progress Ġ- Ġinitial Progress ) Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresources . getInteger ( R . integer . reply _ motion _ duration _ medium )). to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs and wich Anim ?. start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġeach Ġtime Ġthe Ġvalue Ġof Ġ[ sand wich Progress ] Ġchanges . Ġ[ progress ] Ġis Ġthe Ġstate Ġof Ġthe ĊĠĠĠĠ Ġ* Ġs and wich ing , Ġwith Ġ 0 F Ġbeing Ġthe Ġdefault Ġ[ Sand wich State . CLOSED ] Ġstate Ġand Ġ 1 F Ġbeing Ġthe ĊĠĠĠĠ Ġ* Ġ[ Sand wich State . OPEN ] Ġstate . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Sand wich Progress Changed ( progress : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnav Progress Ġ= Ġl erp ( 0 F , Ġ 1 F , Ġ 0 F , Ġ 0 . 5 F , Ġprogress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacc Progress Ġ= Ġl erp ( 0 F , Ġ 1 F , Ġ 0 . 5 F , Ġ 1 F , Ġprogress ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Container . translation Y Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( binding . foreground Container . height Ġ* Ġ 0 . 1 5 F ) Ġ* Ġnav Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . scale X Ġ= Ġ 1 F Ġ- Ġnav Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . scale Y Ġ= Ġ 1 F Ġ- Ġnav Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . alpha Ġ= Ġ 1 F Ġ- Ġnav Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Container . alpha Ġ= Ġ 1 F Ġ- Ġnav Progress ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccount RecyclerView . alpha Ġ= Ġacc Progress ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Shape Drawable . interpolation Ġ= Ġ 1 F Ġ- Ġnav Progress ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAn imate Ġthe Ġtranslation Y Ġof Ġthe Ġbackground Container Ġso Ġjust Ġthe Ġaccount Ġpicker Ġis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpeek ed Ġabove Ġthe ĠBottom AppBar . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Container . translation Y Ġ= Ġprogress Ġ* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( scri m View . bottom Ġ- Ġaccount RecyclerView . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġresources . get Dimension ( R . dim en . bottom _ app _ bar _ height )) Ġ- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( background Container . getTag ( R . id . tag _ view _ top _ snapshot ) Ġas ĠInt )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCall Ġany Ġactions Ġwhich Ġhave Ġbeen Ġregistered Ġto Ġrun Ġon Ġprogress Ġchanges . ĊĠĠĠĠĠĠĠ Ġs and wich Slide Actions . forEach Ġ{ Ġit . on Slide ( progress ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCalled Ġwhen Ġthe Ġ[ Sand wich State ] Ġof Ġthe Ġs and wich ing Ġaccount Ġpicker Ġhas Ġchanged . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġon Sand wich StateChanged ( state : ĠSand wich State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠChange Ġvisibility / click ability Ġof Ġviews Ġwhich Ġob struct Ġuser Ġinteraction Ġwith ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġaccount Ġlist . ĊĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSand wich State . OPEN Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Container . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinding . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforeground Container . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile ImageView . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }