package Ġorg . fal ae app . fal ae . activity Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Activity NotFoundException Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . speech . tts . Text ToS peech Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . Window Ċ import Ġandroid . view . WindowManager Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . appcompat . app . ActionBar Drawer Toggle Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . appcompat . widget . Toolbar Ċ import Ġandroidx . core . view . Gravity Compat Ċ import Ġandroidx . drawer layout . widget . Drawer Layout Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . lifecycle . Observer Ċ import Ġandroidx . lifecycle . ViewModel Provider Ċ import Ġcom . google . android . gms . common . Google Api Availability Ċ import Ġcom . google . android . gms . security . Provider Installer Ċ import Ġcom . google . android . material . navigation . Navigation View Ċ import Ġorg . fal ae app . fal ae . Build Config Ċ import Ġorg . fal ae app . fal ae . R Ċ import Ġorg . fal ae app . fal ae . fragment . Settings Fragment Ċ import Ġorg . fal ae app . fal ae . fragment . Sync User Fragment Ċ import Ġorg . fal ae app . fal ae . fragment . Tab Pager Fragment Ċ import Ġorg . fal ae app . fal ae . model . Spread Sheet Ċ import Ġorg . fal ae app . fal ae . model . User Ċ import Ġorg . fal ae app . fal ae . view model . User ViewModel Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity (), ĠNavigation View . On Navigation ItemSelected Listener , ĊĠĠĠ ĠTab Pager Fragment . Tab Pager Fragment Listener , ĊĠĠĠ ĠSync User Fragment . Sync User Fragment Listener , ĊĠĠĠ ĠProvider Installer . Provider Install Listener Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Drawer : ĠDraw er Layout ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Navigation View : ĠNavigation View ĊĠĠĠ Ġprivate Ġvar Ġdouble Back To Exit Pressed Once : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġuser ViewModel : ĠUser ViewModel ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Window Feature ( Window . FEATURE _ ACTION _ BAR _ OVER LAY ) ĊĠĠĠĠĠĠĠ Ġwindow . set Flags ( WindowManager . LayoutParams . FLAG _ FULL SCREEN , ĠWindow Manager . LayoutParams . FLAG _ FULL SCREEN ) ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġval Ġtoolbar Ġ= ĠfindViewById < Toolbar >( R . id . toolbar ) ĊĠĠĠĠĠĠĠ Ġset Support ActionBar ( toolbar ) ĊĊĠĠĠĠĠĠĠ Ġm Drawer Ġ= ĠfindViewById ( R . id . drawer _ layout ) ĊĠĠĠĠĠĠĠ Ġval Ġtoggle Ġ= ĠAction Bar Drawer Toggle ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġm Drawer , Ġtoolbar , ĠR . string . navigation _ drawer _ open , ĠR . string . navigation _ drawer _ close ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġm Drawer . add Drawer Listener ( toggle ) ĊĠĠĠĠĠĠĠ Ġtoggle . sync State () ĊĠĠĠĠĠĠĠ Ġm Drawer . open Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġm Navigation View Ġ= ĠfindViewById ( R . id . nav _ view ) ĊĠĠĠĠĠĠĠ Ġm Navigation View . set Navigation ItemSelected Listener ( this ) ĊĊĠĠĠĠĠĠĠ Ġuser ViewModel Ġ= ĠViewModel Provider ( this ). get ( User ViewModel :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġuser ViewModel . handle New Version ( Build Config . VERSION _ CODE ) ĊĠĠĠĠĠĠĠ Ġobserve Users () ĊĠĠĠĠĠĠĠ Ġobserve Last Connected User () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ<= ĠBuild . VERSION _ CODES . KIT K AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProvider Installer . install IfNeeded Async ( this , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Last Connected User () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser ViewModel . last Connected UserId . observe ( this , ĠObserver Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ Ġlast Connected UserId Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen User Item ( last Connected UserId ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġobserve Users () Ġ{ ĊĠĠĠĠĠĠĠ Ġuser ViewModel . users . observe ( this , ĠObserver < List < User >> Ġ{ Ġusers Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Navigation View . menu . remove Group ( R . id . users _ group ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers ?. reversed ()?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd User To Menu ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuser ViewModel . load Last Connected User () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen User Item ( userId : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġm Navigation View . menu . find Item ( userId . toInt ()) ĊĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ Ġon Navigation ItemSelected ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd User To Menu ( user : ĠUser , ĠgroupId : ĠInt Ġ= ĠR . id . users _ group , Ġorder : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuser Item Ġ= Ġm Navigation View . menu . add ( groupId , Ġuser . id , Ġorder , Ġuser . name ) ĊĠĠĠĠĠĠĠ Ġuser Item . setIcon ( R . drawable . ic _ person _ black _ 2 4 dp ) ĊĠĠĠĠĠĠĠ Ġuser Item . setOn MenuItem ClickListener Ġ{ Ġitem Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Navigation ItemSelected ( item ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Back Pressed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Drawer . is Drawer Open ( Gravity Compat . START )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Drawer . close Drawer ( Gravity Compat . START ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( double Back To Exit Pressed Once ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Back Pressed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . double Back To Exit Pressed Once Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠR . string . exit _ app _ msg , ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHandler (). post Delayed ({ Ġdouble Back To Exit Pressed Once Ġ= Ġfalse Ġ}, Ġ 2 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Navigation ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment : ĠFragment ĊĠĠĠĠĠĠĠ Ġval Ġtag : ĠString ĊĠĠĠĠĠĠĠ Ġitem . isChecked Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtitle Ġ= Ġitem . title ĊĠĠĠĠĠĠĠ Ġm Drawer . close Drawer ( Gravity Compat . START ) ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġid Ġ= Ġitem . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . add _ user Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠSync User Fragment . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠSync User Fragment :: class . java . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . voice _ item Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen TT SL anguage Settings () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . settings Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠSettings Fragment . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠSettings Fragment :: class . java . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser ViewModel . load User ( id . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment Ġ= ĠTab Pager Fragment . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠTab Pager Fragment :: class . java . simple Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġchange Fragment ( fragment , Ġtag ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Fragment ( fragment : ĠFragment , Ġtag : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsupport FragmentManager . beginTransaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Custom Animations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ right , ĠR . anim . exit _ to _ left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . anim . enter _ from _ left , ĠR . anim . exit _ to _ right ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. replace ( R . id . container , Ġfragment , Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. commit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen TT SL anguage Settings () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstall T ts Ġ= ĠIntent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall T ts . action Ġ= ĠText ToS peech . Engine . ACTION _ INSTALL _ TT S _ DATA ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( install T ts ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠActivity NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . language _ settings _ not _ available ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdisplay Activity ( spread Sheet : ĠSp read Sheet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠDisplay Activity :: class . java ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Display Activity . SP READ SHE ET , Ġspread Sheet ) ĊĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġoverride Pending Transition ( R . anim . enter _ from _ right , ĠR . anim . exit _ to _ left ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Installed () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( java Class . name , Ġ" Provider Ġinstalled Ġor Ġup Ġto Ġdate .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Provider Install Failed ( errorCode : ĠInt , Ġrecovery Intent : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Google Api Availability . getInstance (). is User Res olvable Error ( errorCode )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Api Availability . getInstance (). show Error Dialog Fragment ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠERROR _ DIALOG _ REQUEST _ CODE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider Installer Not Available () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider Installer Not Available () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĠresultCode : ĠInt , ĊĠĠĠĠĠĠĠ Ġdata : ĠIntent ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠERROR _ DIALOG _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ C ANCE LED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Provider Installer Not Available () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Provider Installer Not Available () Ġ{ ĊĠĠĠĠĠĠĠ ĠToast . makeText ( this , ĠgetString ( R . string . provider _ not _ available ), ĠToast . LENGTH _ LONG ). show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠERROR _ DIALOG _ REQUEST _ CODE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPRO VIDER _ INST ALLED Ġ= Ġ" provider _ installed " ĊĠĠĠ Ġ} Ċ } Ċ