package Ġbr . com . cross life . commons . components . tab bar Ċ Ċ import Ġandroid . graphics . Rect Ċ import Ġandroid . view . View Tree Observer Ċ import Ġandroidx . compose . animation . Experimental Animation Api Ċ import Ġandroidx . compose . foundation . layout . padding Ċ import Ġandroidx . compose . material . Sca ffold Ċ import Ġandroidx . compose . runtime .* Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . platform . Local View Ċ import Ġandroidx . navigation . Nav Controller Ċ import Ġandroidx . navigation . Nav Graph . Companion . find Start Destination Ċ import Ġbr . com . cross life . commons . components . animation . Fade Animation Ċ import Ġbr . com . cross life . commons . components . animation . Vertical Slide Animation Ċ import Ġbr . com . cross life . commons . components . bottomnavigation . Bottom Navigation Ċ import Ġbr . com . cross life . navigation . Screen Ċ import Ġbr . com . cross life . navigation . Tab ĊĊ Ċ enum Ġclass ĠKeyboard Ġ{ ĊĠĠĠ ĠOpen ed , ĠClosed Ċ } Ċ Ċ @ Composable Ċ fun Ġkeyboard As State (): ĠState < Keyboard > Ġ{ ĊĠĠĠ Ġval Ġkeyboard State Ġ= Ġremember Ġ{ Ġmutable State Of ( Keyboard . Closed ) Ġ} ĊĠĠĠ Ġval Ġview Ġ= ĠLocal View . current ĊĠĠĠ ĠDis posable Effect ( view ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġon Global Listener Ġ= ĠView Tree Observer . On Global Layout Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠRect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . getWindow Visible Display Frame ( rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreen Height Ġ= Ġview . root View . height ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey pad Height Ġ= Ġscreen Height Ġ- Ġrect . bottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeyboard State . value Ġ= Ġif Ġ( key pad Height Ġ> Ġscreen Height Ġ* Ġ 0 . 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard . Opened ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard . Closed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . view Tree Observer . add On Global Layout Listener ( on Global Listener ) ĊĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . view Tree Observer . remove On Global Layout Listener ( on Global Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġkeyboard State Ċ } ĊĊ Ċ @ Experimental Animation Api Ċ @ Composable Ċ fun ĠNav Controller . TabBar ( content : Ġ@ Composable Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġval Ġcurrent Tab Ġby Ġcurrent Tab As State () ĊĠĠĠ Ġval Ġkeyboard State Ġby Ġkeyboard As State () ĊĠĠĠ Ġval Ġis Tab None Ġ= Ġcurrent Tab Ġ!= ĠTab . None Ġ&& Ġkeyboard State Ġ!= ĠKeyboard . Opened ĊĊĠĠĠ ĠScaffold ( ĊĠĠĠĠĠĠĠ Ġbottom Bar Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVertical Slide Animation ( visible Ġ= Ġis Tab None ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBottom Navigation ( current Tab ) Ġ{ Ġscreen Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate ( screen . route ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Single Top Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ ĠTODO Ġneed Ġto Ġfigure Ġout Ġhow Ġback Ġto Ġstart Destination Ġfrom Ġnested Ġnavigation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* ĠĠ Ġwhen Ġclicked Ġtwice ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop Up To ( graph . find Start Destination (). id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsave State Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ{ Ġinner Padding Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ade Animation ( modifier Ġ= ĠModifier . padding ( inner Padding )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Stable Ċ @ Composable Ċ private Ġfun ĠNav Controller . current Tab As State (): ĠState < Tab > Ġ{ ĊĠĠĠ Ġval Ġselected Item Ġ= Ġremember Ġ{ Ġmutable State Of ( Tab . None ) Ġ} ĊĊĠĠĠ ĠDis posable Effect ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠNav Controller . On Destination Changed Listener Ġ{ Ġ_, Ġdestination , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtab Item Ġ= ĠScreen . find Screen By Route ( destination . route )?. tab Item Ġ?: ĠTab . None ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Item . value Ġ= Ġtab Item ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġadd On Destination Changed Listener ( listener ) ĊĊĠĠĠĠĠĠĠ Ġon Dispose Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove On Destination Changed Listener ( listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġselected Item Ċ }