package Ġcom . quick blo x . sample . chat . kotlin . ui . activity Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . System Clock Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . view . Menu Ċ import Ġandroid . view . MenuItem Ċ import Ġandroid . view . View Ċ import Ġandroid . widget .* Ċ import Ġandroidx . appcompat . widget . Search View Ċ import Ġandroidx . core . view . get Ċ import Ġcom . google . android . material . chip . Chip Ċ import Ġcom . google . android . material . chip . Chip Group Ċ import Ġcom . quick blo x . chat . model . QB Chat Dialog Ċ import Ġcom . quick blo x . core . QB Entity Callback Ċ import Ġcom . quick blo x . core . exception . QB Response Exception Ċ import Ġcom . quick blo x . core . request . Generic Query Rule Ċ import Ġcom . quick blo x . core . request . QB Paged RequestBuilder Ċ import Ġcom . quick blo x . sample . chat . kotlin . R Ċ import Ġcom . quick blo x . sample . chat . kotlin . ui . adapter . Checkbox Users Adapter Ċ import Ġcom . quick blo x . sample . chat . kotlin . ui . adapter . ScrollView With Max Height Ċ import Ġcom . quick blo x . sample . chat . kotlin . utils . chat . CURRENT _ PAGE _ B UNDLE _ PARAM Ċ import Ġcom . quick blo x . sample . chat . kotlin . utils . chat . Chat Helper Ċ import Ġcom . quick blo x . sample . chat . kotlin . utils . chat . TOTAL _ PAGES _ B UNDLE _ PARAM Ċ import Ġcom . quick blo x . sample . chat . kotlin . utils . getColor Circle Drawable Ċ import Ġcom . quick blo x . sample . chat . kotlin . utils . short Toast Ċ import Ġcom . quick blo x . users . Q BU sers Ċ import Ġcom . quick blo x . users . model . QB User Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . collections . ArrayList Ċ Ċ private Ġconst Ġval ĠEX TRA _ QB _ DIALOG Ġ= Ġ" qb _ dialog " Ċ const Ġval ĠEX TRA _ QB _ USERS Ġ= Ġ" qb _ users " Ċ const Ġval ĠMIN IMUM _ CHAT _ OCC UP ANT S _ SIZE Ġ= Ġ 1 Ċ const Ġval ĠPRIVATE _ CHAT _ OCC UP ANT S _ SIZE Ġ= Ġ 2 Ċ const Ġval ĠEX TRA _ CHAT _ NAME Ġ= Ġ" chat _ name " Ċ const Ġval ĠUSER S _ PAGE _ SIZE Ġ= Ġ 1 0 0 Ċ const Ġval ĠMIN _ SEARCH _ QUERY _ LENGTH Ġ= Ġ 3 Ċ const Ġval ĠSEARCH _ DELAY Ġ= Ġ 6 0 0 L Ċ Ċ class ĠSelect Users Activity Ġ: ĠBase Activity () Ġ{ ĊĠĠĠ Ġprivate Ġval ĠC LIC K _ DELAY Ġ= ĠTimeUnit . SECONDS . to Millis ( 2 ) ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġusers ListView : ĠListView ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠprogressBar : ĠProgress Bar ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsearch View : ĠSearch View ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmenu : ĠMenu ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġscroll View : ĠScroll View With Max Height ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchip Group : ĠCh ip Group ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtv NotFound : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġusers Adapter : ĠCheckbox Users Adapter ĊĠĠĠ Ġprivate Ġvar Ġexisting Users Ġ= ĠHashSet < QB User >() ĊĠĠĠ Ġprivate Ġvar Ġlast Click Time Ġ= Ġ 0 L ĊĠĠĠ Ġprivate Ġvar Ġq b Chat Dialog : ĠQ B Chat Dialog ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġchat Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠcurrentPage : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar ĠisLoading : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Search Query : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġhas Next Page : ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ DIALOG _ NAME Ġ= Ġ 1 3 5 ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart For Result ( activity : ĠActivity , Ġcode : ĠInt , Ġdialog : ĠQ B Chat Dialog ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( activity , ĠSelect Users Activity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ QB _ DIALOG , Ġdialog ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . startActivity For Result ( intent , Ġcode ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ select _ users ) ĊĊĠĠĠĠĠĠĠ Ġintent . get Serializable Extra ( EXTRA _ QB _ DIALOG )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġq b Chat Dialog Ġ= Ġit Ġas ĠQ B Chat Dialog ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinit Ui () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( qb Chat Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Dialog () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit Ui () Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById ( R . id . progress _ select _ users ) ĊĠĠĠĠĠĠĠ Ġusers ListView Ġ= ĠfindViewById ( R . id . list _ select _ users ) ĊĠĠĠĠĠĠĠ Ġsearch View Ġ= ĠfindViewById ( R . id . search ) ĊĠĠĠĠĠĠĠ Ġscroll View Ġ= ĠfindViewById ( R . id . scroll _ view ) ĊĠĠĠĠĠĠĠ Ġscroll View . setMax Height ( 2 2 5 ) ĊĠĠĠĠĠĠĠ Ġchip Group Ġ= ĠfindViewById ( R . id . ch ips ) ĊĠĠĠĠĠĠĠ Ġtv NotFound Ġ= ĠfindViewById ( R . id . tv _ no _ users _ found ) ĊĠĠĠĠĠĠĠ Ġusers Adapter Ġ= ĠCheckbox Users Adapter ( this @ Select Users Activity , ĠArrayList ()) ĊĠĠĠĠĠĠĠ Ġusers ListView . adapter Ġ= Ġusers Adapter ĊĊĠĠĠĠĠĠĠ Ġsearch View . setOn Query Text Listener ( Search Query Listener ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġediting Chat Ġ= Ġintent . get Serializable Extra ( EXTRA _ QB _ DIALOG ) Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( editing Chat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= ĠgetString ( R . string . select _ users _ edit _ chat ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. title Ġ= ĠgetString ( R . string . select _ users _ create _ chat _ title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. subtitle Ġ= ĠgetString ( R . string . select _ users _ create _ chat _ subtitle , Ġ" 0 ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsupport ActionBar ?. set Display Home As Up Enabled ( true ) ĊĊĠĠĠĠĠĠĠ Ġusers ListView . on ItemClickListener Ġ= ĠAdapter View . On ItemClickListener Ġ{ Ġparent , Ġview , Ġposition , Ġid Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . on Item Clicked ( position , Ġview , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . getItem ( 0 ). isVisible Ġ= Ġ( users Adapter . selected Users . size Ġ>= Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsubtitle Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( users Adapter . selected Users . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Ġ= ĠgetString ( R . string . select _ users _ create _ chat _ subtitle , Ġusers Adapter . selected Users . size . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubtitle Ġ= ĠgetString ( R . string . select _ users _ create _ chat _ subtitle _ single , Ġ" 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsupport ActionBar ?. subtitle Ġ= Ġsubtitle ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchip Group . removeAll Views () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( user Ġin Ġusers Adapter . selected Users ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchip Ġ= ĠCh ip ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip . text Ġ= Ġuser . fullName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip . chip Icon Ġ= Ġget Color Circle Drawable ( user . id . hashCode ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip . is Close Icon Visible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip . is Check able Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip . is Clickable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Group . addView ( chip Ġas ĠView ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Group . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscroll View . full Scroll ( ScrollView . FOCUS _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( users Adapter . selected Users . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchip Group . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġusers ListView . setOn Scroll Listener ( Scroll Listener ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Options Menu ( menu : ĠMenu ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . menu Ġ= Ġmenu ĊĠĠĠĠĠĠĠ Ġmenu Inflater . inflate ( R . menu . menu _ activity _ select _ users , Ġmenu ) ĊĠĠĠĠĠĠĠ Ġif Ġ( qb Chat Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . get ( 0 ). title Ġ= ĠgetString ( R . string . menu _ done ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Options ItemSelected ( item : ĠMenuItem ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( System Clock . uptime Millis () Ġ- Ġlast Click Time Ġ< ĠC LIC K _ DELAY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlast Click Time Ġ= ĠSystem Clock . uptime Millis () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( item . itemId ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠR . id . menu _ select _ people _ action _ done Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(:: users Adapter . isInitialized ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( users Adapter . selected Users . size Ġ< ĠMIN IMUM _ CHAT _ OCC UP ANT S _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshort Toast ( R . string . select _ users _ choose _ users ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qb Chat Dialog Ġ== Ġnull Ġ&& Ġusers Adapter . selected Users . size Ġ>= ĠPRIVATE _ CHAT _ OCC UP ANT S _ SIZE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNew Group Activity . start For Result ( this @ Select Users Activity , ĠREQUEST _ DIALOG _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpass Result To Caller Activity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġsuper . on Options ItemSelected ( item ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( data ?. get Serializable Extra ( EXTRA _ CHAT _ NAME ). toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Name Ġ= Ġdata ?. get Serializable Extra ( EXTRA _ CHAT _ NAME ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpass Result To Caller Activity () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpass Result To Caller Activity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent () ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ QB _ USERS , Ġusers Adapter . selected Users ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( chat Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( EXTRA _ CHAT _ NAME , Ġchat Name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset Result ( Activity . RESULT _ OK , Ġintent ) ĊĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġshow Progress Dialog ( R . string . dlg _ loading ) ĊĠĠĠĠĠĠĠ Ġval Ġdialog ID Ġ= Ġq b Chat Dialog !!. dialog Id ĊĠĠĠĠĠĠĠ ĠChat Helper . get Dialog ById ( dialog ID , Ġobject Ġ: ĠQ B Entity Callback < QB Chat Dialog > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( qb Chat Dialog : ĠQ B Chat Dialog , Ġbundle : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Select Users Activity . qb Chat Dialog Ġ= Ġq b Chat Dialog ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠQ B Response Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Snackbar ( R . string . select _ users _ get _ dialog _ error , Ġe , ĠView . OnClickListener Ġ{ Ġupdate Dialog () Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Users From Dialog Ġ() Ġ{ ĊĠĠĠĠĠĠĠ ĠChat Helper . get Users From Dialog ( qb Chat Dialog !! , Ġobject Ġ: ĠQ B Entity Callback < ArrayList < QB User >> { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( users From Dialog : ĠArrayList < QB User > ?, Ġb : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers From Dialog ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Users . addAll ( users From Dialog ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠQ B Response Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Snackbar ( R . string . select _ users _ get _ users _ dialog _ error , Ġe , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Users From QB ( query : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Pro gres Dialog Showing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenable Progress () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠcurrentPage Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġrules Ġ= ĠArrayList < Generic Query Rule >() ĊĠĠĠĠĠĠĠ Ġrules . add ( Generic Query Rule ( ORDER _ RULE , ĠORDER _ VALUE _ UPDATED _ AT )) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Builder Ġ= ĠQ B Paged RequestBuilder () ĊĠĠĠĠĠĠĠ Ġrequest Builder . rules Ġ= Ġrules ĊĠĠĠĠĠĠĠ Ġrequest Builder . per Page Ġ= ĠUSER S _ PAGE _ SIZE ĊĠĠĠĠĠĠĠ Ġrequest Builder . page Ġ= ĠcurrentPage ĊĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Users Without Query ( request Builder ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Users By Query ( query !! , Ġrequest Builder ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Users Without Query ( request Builder : ĠQ B Paged RequestBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠQ BU sers . get Users ( request Builder ). perform Async ( object Ġ: ĠQ B Entity Callback < ArrayList < QB User >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( users List : ĠArrayList < QB User >, Ġparams : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv NotFound . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Pages From Params Ġ= Ġparams ?. get ( TOTAL _ PAGES _ B UNDLE _ PARAM ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ>= Ġtotal Pages From Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Next Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qb Chat Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Users . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers List . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . add New List ( users List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . add Users ( users List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠQ B Response Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Snackbar ( R . string . select _ users _ get _ users _ error , Ġe , ĠView . OnClickListener Ġ{ Ġload Users Without Query ( request Builder ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Users By Query ( query : ĠString , Ġrequest Builder : ĠQ B Paged RequestBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ ĠQ BU sers . get Users By FullName ( query , Ġrequest Builder ). perform Async ( object Ġ: ĠQ B Entity Callback < ArrayList < QB User >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonSuccess ( qb Users : ĠArrayList < QB User > ?, Ġparams : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Pages From Params Ġ= Ġparams ?. get ( TOTAL _ PAGES _ B UNDLE _ PARAM ) Ġas ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ>= Ġtotal Pages From Params ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Next Page Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qb Users Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv NotFound . visibility Ġ= ĠView . IN VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qb Chat Dialog Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexisting Users . forEach Ġ{ Ġuser Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġq b Users . remove ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( currentPage Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . add New List ( qb Users ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers ListView . smooth Scroll To Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . add Users ( qb Users ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . clear List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv NotFound . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( e : ĠQ B Response Exception ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisable Progress () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e ?. http StatusCode Ġ== Ġ 4 0 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Adapter . clear List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtv NotFound . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Error Snackbar ( R . string . select _ users _ get _ users _ error , Ġe , ĠView . OnClickListener Ġ{ Ġload Users By Query ( query , Ġrequest Builder ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġenable Progress () Ġ{ ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdisable Progress () Ġ{ ĊĠĠĠĠĠĠĠ Ġhide Progress Dialog () ĊĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ ĠisLoading Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSearch Query Listener Ġ: ĠSearch View . On Query Text Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġtimer Ġ= ĠTimer () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Submit ( query : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Query Text Change ( new Text : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer . schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun On Ui Thread Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentPage Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Next Page Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Search Query Ġ= Ġnew Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text . length Ġ>= ĠMIN _ SEARCH _ QUERY _ LENGTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( new Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĠSEARCH _ DELAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠScroll Listener Ġ: ĠAbs ListView . On Scroll Listener Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll ( view : ĠAbs ListView ?, Ġfirst Visible Item : ĠInt , Ġvisible ItemCount : ĠInt , Ġtotal ItemCount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! isLoading Ġ&& Ġtotal ItemCount Ġ> Ġ 0 Ġ&& Ġ( first Visible Item Ġ+ Ġvisible ItemCount Ġ* Ġ 3 ) Ġ>= Ġtotal ItemCount Ġ&& Ġhas Next Page ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( last Search Query )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Users From QB ( last Search Query ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Scroll StateChanged ( view : ĠAbs ListView ?, Ġscroll State : ĠInt ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }