package Ġim . vector . home Ċ Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . view . View Ċ import Ġandroid . view . View . GONE Ċ import Ġandroid . view . View . VISIBLE Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . FragmentManager Ċ import Ġandroidx . fragment . app . Fragment State Pager Adapter Ċ import Ġim . vector . R Ċ import Ġim . vector . adapters . Home Room Adapter Ċ import Ġim . vector . ui . themes . Theme Utils . set Tab Layout Theme Ċ import Ġim . vector . util . Home Rooms ViewModel Ċ import Ġim . vector . util . Preferences Manager Ċ import Ġim . vector . util . Room Utils Ċ import Ġkotlinx . android . synt hetic . main . fragment _ view _ pager _ tab .* Ċ import Ġorg . matrix . android sdk . data . Room Ċ import Ġorg . matrix . android sdk . data . Room Tag Ċ Ċ class ĠCom municate Home Fragment Ġ: ĠBase Com municate Home Fragment (), ĠHome Room Adapter . On Select Room Listener , ĠRegister Listener , ĠCom municate Tab Badge Update Listener Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdata Update Listeners Ġ= Ġmutable Map Of < ROOM _ FRAG MENTS , ĠUp Date Listener ? >( ROOM _ FRAG MENTS . FA V OR ITE Ġto Ġnull , ĠRO OM _ FRAG MENTS . CHAT Ġto Ġnull , ĠRO OM _ FRAG MENTS . LOW _ PRIORITY Ġto Ġnull ) ĊĠĠĠ Ġprivate Ġvar Ġresult : ĠHome Rooms ViewModel . Result ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġroom Position Map Ġ= Ġmutable Map Of ( ROOM _ FRAG MENTS . FA V OR ITE Ġto Ġ- 1 , ĠRO OM _ FRAG MENTS . CHAT Ġto Ġ- 1 , ĠRO OM _ FRAG MENTS . LOW _ PRIORITY Ġto Ġ- 1 ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Layout Res Id (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠR . layout . fragment _ view _ pager _ tab ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġpager . off screen Page Limit Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġpager . adapter Ġ= ĠHome Pager Adapter ( child FragmentManager ) ĊĠĠĠĠĠĠĠ Ġtab Layout . setup With ViewPager ( pager ) ĊĠĠĠĠĠĠĠ Ġactivity ?. let Ġ{ Ġactivity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Tab Layout Theme ( activity , Ġtab Layout ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Filter ( pattern : ĠString ?, Ġlistener : ĠOn Filter Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Update Listeners . forEach Ġ{ Ġlistener Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Map . value ?. on Filter ( pattern , Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Reset Filter () Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Update Listeners . forEach Ġ{ Ġlistener Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Map . value ?. on Filter ("", Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Room Result Updated ( result : ĠHome Rooms ViewModel . Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Res umed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Data ( result ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Room Position () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġresult ?. let Ġ{ Ġresult Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Position Map [ ROOM _ FRAG MENTS . CHAT ] Ġ= Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Position Map [ ROOM _ FRAG MENTS . FA V OR ITE ] Ġ= Ġif Ġ( result . fav our ites . isEmpty ()) Ġ- 1 Ġelse Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroom Position Map [ ROOM _ FRAG MENTS . LOW _ PRIORITY ] Ġ= Ġif Ġ( result . low Prior ities . isEmpty ()) Ġ- 1 Ġelse Ġcount ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Badge Update ( count : ĠInt , Ġroom Fragment Type : ĠRO OM _ FRAG MENTS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġroom Position Map [ room Fragment Type ]?. let Ġ{ Ġposition Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġ- 1 Ġ&& Ġpager . adapter ?. count Ġ?: Ġ 0 Ġ> Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab Layout . get Tab At ( position )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor Create Badge ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbadge ?. isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbadge ?. number Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Badge () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* Ġ***************************************************************** ************************ **** ĊĠĠĠĠ Ġ* ĠData Ġmanagement ĊĠĠĠĠ Ġ* Ġ***************************************************************** ************************ **** ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInit Ġthe Ġrooms Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrefresh Data ( result : ĠHome Rooms ViewModel . Result ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . result Ġ= Ġresult ĊĠĠĠĠĠĠĠ Ġval Ġpin Mis sed Notifications Ġ= ĠPreferences Manager . pin Mis sed Notifications ( activity ) ĊĠĠĠĠĠĠĠ Ġval Ġpin Un read Messages Ġ= ĠPreferences Manager . pin Un read Messages ( activity ) ĊĠĠĠĠĠĠĠ Ġval Ġnotification Comparator Ġ= ĠRoom Utils . get Not if Count Rooms Comparator ( m Session , Ġpin Mis sed Notifications , Ġpin Un read Messages ) ĊĠĠĠĠĠĠĠ Ġcalculate Room Position () ĊĠĠĠĠĠĠĠ Ġif Ġ(( room Position Map [ ROOM _ FRAG MENTS . FA V OR ITE ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ- 1 ) Ġ+ Ġ( room Position Map [ ROOM _ FRAG MENTS . LOW _ PRIORITY ] Ġ?: Ġ- 1 ) Ġ== Ġ- 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Layout . visibility Ġ= ĠG ONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab Layout . visibility Ġ= ĠVIS IBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpager . adapter ?. notify DataSet Changed () ĊĠĠĠĠĠĠĠ Ġdata Update Listeners . forEach Ġ{ Ġlistener Map Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( listener Map . key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . FA V OR ITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Map . value ?. on Update ( result ?. fav our ites , Ġnotification Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . CHAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Map . value ?. on Update ( result ?. other Rooms ?. plus ( result . direct Ch ats ), Ġnotification Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . LOW _ PRIORITY Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener Map . value ?. on Update ( result ?. low Prior ities , Ġnotification Comparator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Activity . hide Waiting View () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Long Click Room ( v : ĠView ?, Ġroom : ĠRoom ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUser Ġclicked Ġon Ġthe Ġ" more Ġactions " Ġarea ĊĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġroom !!. account Data . keys ĊĠĠĠĠĠĠĠ Ġval Ġis Favorite Ġ= Ġtags Ġ!= Ġnull Ġ&& Ġtags . contains ( Room Tag . ROOM _ TAG _ FA VO UR ITE ) ĊĠĠĠĠĠĠĠ Ġval Ġis Low Priority Ġ= Ġtags Ġ!= Ġnull Ġ&& Ġtags . contains ( Room Tag . ROOM _ TAG _ LOW _ PRIORITY ) ĊĠĠĠĠĠĠĠ ĠRoom Utils . display PopupMenu ( activity , Ġm Session , Ġroom , Ġv , Ġis Favorite , Ġis Low Priority , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonSelect Room ( room : ĠRoom ?, Ġposition : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġopen Room ( room ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Register ( fragment Type : ĠRO OM _ FRAG MENTS , Ġlistener : ĠUp Date Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Update Listeners [ fragment Type ] Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Unregister ( fragment Type : ĠRO OM _ FRAG MENTS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Update Listeners [ fragment Type ] Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinner Ġclass ĠHome Pager Adapter ( fm : ĠFragment Manager ) Ġ: ĠFragment State Pager Adapter ( fm ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpin Mis sed Notifications Ġ= ĠPreferences Manager . pin Mis sed Notifications ( activity ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpin Un read Messages Ġ= ĠPreferences Manager . pin Un read Messages ( activity ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnotification Comparator Ġ= ĠRoom Utils . get Not if Count Rooms Comparator ( m Session , Ġpin Mis sed Notifications , Ġpin Un read Messages ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Fragment For Normal () Ġ= ĠChat Room Fragment (). also Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . addListener ( this @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment , Ġnull , Ġthis @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . on Update ( result ?. direct Ch ats ?. let Ġ{ Ġresult ?. other Rooms ?. plus ( it ) Ġ}, Ġnotification Comparator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Fragment For Favorite () Ġ= ĠF avorite Room Fragment (). also Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . addListener ( this @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment , Ġnull , Ġthis @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . on Update ( result ?. fav our ites , Ġnotification Comparator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Fragment For Low Priority () Ġ= ĠLow Priority Room Fragment (). also Ġ{ Ġfragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . addListener ( this @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment , Ġnull , Ġthis @ Com municate Home Fragment , Ġthis @ Com municate Home Fragment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . on Update ( result ?. low Prior ities , Ġnotification Comparator ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Fragment ( room Fragment : ĠRO OM _ FRAG MENTS ): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( room Fragment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . FA V OR ITE Ġ-> Ġget Fragment For Favorite () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . CHAT Ġ-> Ġget Fragment For Normal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRO OM _ FRAG MENTS . LOW _ PRIORITY Ġ-> Ġget Fragment For Low Priority () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem ( position : ĠInt ): ĠFragment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġroom Position Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 Ġ&& Ġvalue Ġ== Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Fragment ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġfragment Ġis Ġfound Ġfor Ġthat Ġposition .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetItem Position (` object `: ĠAny ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPOSITION _ NONE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Count (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( _, Ġvalue ) Ġin Ġroom Position Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Page Title ( position : ĠInt ): ĠCharSequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġroom Position Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġ- 1 Ġ&& Ġvalue Ġ== Ġposition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkey . title ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No Ġtitle Ġis Ġfound Ġfor Ġthat Ġposition .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠRO OM _ FRAG MENTS ( val Ġtitle : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠF AV OR ITE (" F avour ites "), ĊĠĠĠĠĠĠĠ ĠCH AT (" Ch ats "), ĊĠĠĠĠĠĠĠ ĠLOW _ PRIORITY (" Low ĠPriority ") ĊĠĠĠ Ġ} Ċ } ĊĊ