package Ġcom . fight pan dem ics . ui Ċ Ċ import Ġandroid . animation . Animator Ċ import Ġandroid . animation . Animator Listener Adapter Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Display Metrics Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Animation Utils Ċ import Ġandroid . widget . ImageView Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . view . margin Bottom Ċ import Ġandroidx . core . view . margin Right Ċ import Ġandroidx . core . view . margin Top Ċ import Ġandroidx . lifecycle . LiveData Ċ import Ġandroidx . lifecycle . observe Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Destination Ċ import Ġandroidx . navigation . ui . setup ActionBar With Nav Controller Ċ import Ġcom . fight pan dem ics . R Ċ import Ġcom . fight pan dem ics . utils . setup With Nav Controller Ċ import Ġcom . google . android . material . bottomnavigation . Bottom Navigation View Ċ import Ġcom . google . android . material . button . Material Button Ċ import Ġcom . google . android . material . floating action button . Floating ActionButton Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠNav Controller . On Destination Changed Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbottom Navigation View : ĠBottom Navigation View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab : ĠFloating ActionButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab Create As Org : ĠMaterial Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab Create As Individual : ĠMaterial Button ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdot : ĠImageView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab Open : ĠAnimation ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġfab Close : ĠAnimation ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrotate Forward : ĠAnimation ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrotate Backward : ĠAnimation ĊĊĠĠĠ Ġprivate Ġvar Ġis Fab Open Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcurrent Nav Controller : ĠLive Data < Nav Controller >? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġbottom Navigation View Ġ= ĠfindViewById ( R . id . bottom NavBar ) ĊĠĠĠĠĠĠĠ Ġfab Ġ= ĠfindViewById ( R . id . fab ) ĊĠĠĠĠĠĠĠ Ġfab Create As Individual Ġ= ĠfindViewById ( R . id . fab Create As In div ) ĊĠĠĠĠĠĠĠ Ġfab Create As Org Ġ= ĠfindViewById ( R . id . fab Create As Org ) ĊĠĠĠĠĠĠĠ Ġdot Ġ= ĠfindViewById ( R . id . dot ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( savedInstanceState Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Bottom NavigationBar () ĊĠĠĠĠĠĠĠ Ġ} Ġ// ĠElse , Ġneed Ġto Ġwait Ġfor Ġon Restore InstanceState ĊĠĠĠĠĠĠĠ ĠsetUp Bottom Navigation And Fab () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( savedInstanceState : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Restore InstanceState ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġsetup Bottom NavigationBar () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Bottom NavigationBar () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnav Graph Ids Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . navigation . nav _ home , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . navigation . nav _ search , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . navigation . nav _ inbox , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . navigation . nav _ profile ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontroller Ġ= Ġbottom Navigation View . setup With Nav Controller ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnav Graph Ids Ġ= Ġnav Graph Ids , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Manager Ġ= Ġsupport FragmentManager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Id Ġ= ĠR . id . main Host Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Ġ= Ġintent ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġcontroller . observe ( this ) Ġ{ Ġsetup ActionBar With Nav Controller ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Nav Controller Ġ= Ġcontroller ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsetUp Bottom Navigation And Fab () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Nav Controller ?. observe ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add On Destination Changed Listener ( this @ MainActivity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfab . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Fab Action () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetShow Motion Spec Resource ( R . anim ator . fab _ show ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Hide Motion Spec Resource ( R . anim ator . fab _ hide ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab Action () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destination Changed ( ĊĠĠĠĠĠĠĠ Ġcontroller : ĠNav Controller , ĊĠĠĠĠĠĠĠ Ġdestination : ĠNav Destination , ĊĠĠĠĠĠĠĠ Ġarguments : ĠBundle ?, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( destination . id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . home Fragment , ĠR . id . search Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . inbox Fragment , ĠR . id . profile Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Bottom Bar ( destination ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . filter Fragment Ġ-> Ġhide Bottom Bar () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Bottom Bar ( destination : ĠNav Destination ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbottom Navigation View . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġbottom Navigation View . handle Bottom Nav Selection ( destination ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Bottom Bar () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Fab Open ) Ġhide Fab Actions () ĊĠĠĠĠĠĠĠ Ġbottom Navigation View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġdot . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġfab . hide () ĊĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġhandle Ġon Ġthe Ġanim ator Ġthat Ġhide s Ġthe Ġbottom Ġapp Ġbar Ġso Ġwe Ġcan Ġwait Ġto Ġhide ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġfab Ġand Ġbottom Ġapp Ġbar Ġuntil Ġafter Ġit 's Ġexit Ġanimation Ġfinishes . ĊĠĠĠĠĠĠĠ Ġbottom Navigation View . animate (). set Listener ( object Ġ: ĠAn imator Listener Adapter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġis Canceled Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation End ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Canceled ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHide Ġthe ĠBottom AppBar Ġto Ġavoid Ġit Ġshowing Ġabove Ġthe Ġkeyboard ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġcomp osing Ġa Ġnew Ġemail . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Navigation View . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfab . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Animation Cancel ( animation : ĠAn imator ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Canceled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Support Navigate Up (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Nav Controller ?. value ?. navigate Up () Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Fab Action () Ġ{ ĊĠĠĠĠĠĠĠ Ġfab Open Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . fab _ open ) ĊĠĠĠĠĠĠĠ Ġfab Close Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . fab _ close ) ĊĠĠĠĠĠĠĠ Ġrotate Forward Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . rotate _ forward ) ĊĠĠĠĠĠĠĠ Ġrotate Backward Ġ= ĠAnimation Utils . load Animation ( this , ĠR . anim . rotate _ backward ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfab Action () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Fab Open ) Ġhide Fab Actions () Ġelse Ġshow Fab Actions () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Fab Actions () Ġ{ ĊĠĠĠĠĠĠĠ Ġfab . start Animation ( rotate Forward ) ĊĠĠĠĠĠĠĠ Ġfab Create As Org . start Animation ( fab Open ) ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . start Animation ( fab Open ) ĊĠĠĠĠĠĠĠ Ġfab Create As Org . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . is Clickable Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġfab Create As Org . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġis Fab Open Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhide Fab Actions () Ġ{ ĊĠĠĠĠĠĠĠ Ġfab . start Animation ( rotate Backward ) ĊĠĠĠĠĠĠĠ Ġfab Create As Org . start Animation ( fab Close ) ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . start Animation ( fab Close ) ĊĠĠĠĠĠĠĠ Ġfab Create As Org . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfab Create As Individual . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġfab Create As Org . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠ Ġis Fab Open Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBottom Navigation View . handle Bottom Nav Selection ( destination : ĠNav Destination ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . menu . getItem ( 0 ). title Ġ= Ġif Ġ( destination . id Ġ== ĠR . id . home Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Dot Location ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontext . getString ( R . string . home ) ĊĊĠĠĠĠĠĠĠ Ġthis . menu . getItem ( 1 ). title Ġ= Ġif Ġ( destination . id Ġ== ĠR . id . search Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Dot Location ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontext . getString ( R . string . search ) ĊĊĠĠĠĠĠĠĠ Ġthis . menu . getItem ( 2 ). title Ġ= Ġif Ġ( destination . id Ġ== ĠR . id . inbox Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Dot Location ( 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontext . getString ( R . string . inbox ) ĊĊĠĠĠĠĠĠĠ Ġthis . menu . getItem ( 3 ). title Ġ= Ġif Ġ( destination . id Ġ== ĠR . id . profile Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Dot Location ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġcontext . getString ( R . string . profile ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Dot Location ( location : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Params Ġ= Ġdot . layout Params Ġas ĠViewGroup . Margin LayoutParams ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Metrics Ġ= ĠDisplay Metrics () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġandroid . os . Build . VERSION _ CODES . R ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . display ?. get Real Metrics ( display Metrics ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġwindow Manager . default Display . get Metrics ( display Metrics ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġdisplay Metrics . width Pixels ĊĠĠĠĠĠĠĠ Ġwhen Ġ( location ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlong Ġdecimals Ġbelow Ġso Ġthat Ġwith Ġany Ġscreen Ġsize , Ġthe Ġdot Ġwill Ġbe Ġplaced Ġcorrectly Ġinstead Ġof Ġhardcoded Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( 0 . 1 1 8 3 3 3 3 3 3 Ġ* Ġwidth ). toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . set Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( 0 . 3 7 0 8 3 3 3 3 Ġ* Ġwidth ). toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . set Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( 0 . 6 1 6 6 6 6 6 7 Ġ* Ġwidth ). toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Params . set Margins ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(( 0 . 8 6 6 6 6 6 6 7 Ġ* Ġwidth ). toInt ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Right , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdot . margin Bottom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdot . layout Params Ġ= Ġlayout Params ĊĠĠĠ Ġ} Ċ } Ċ