package Ġcom . sa ur ab h . bluetooth chat app . ui . fragment Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os .* Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . EditText Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . view . isVisible Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . fragment . app . Fragment Activity Ċ import Ġandroidx . fragment . app . view Models Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . sa ur ab h . bluetooth chat app .* Ċ import Ġcom . sa ur ab h . bluetooth chat app . adapter . Chat Adapter Ċ import Ġcom . sa ur ab h . bluetooth chat app . chat . Message Ack Ċ import Ġcom . sa ur ab h . bluetooth chat app . chat . Message Status Ċ import Ġcom . sa ur ab h . bluetooth chat app . service . Bluetooth Chat Service Ċ import Ġcom . sa ur ab h . bluetooth chat app . view model . Chat ViewModel Ċ import Ġdagger . h ilt . android . Android EntryPoint Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . collect Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . with Context Ċ Ċ @ Android EntryPoint Ċ class ĠChat Fragment Ġ: ĠFragment ( R . layout . fragment _ chat ) Ġ{ ĊĠĠĠ Ġ// ĠLayout ĠViews ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Out EditText : ĠEditText ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Send Button : ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġconnection State Ġ: ĠButton ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġre cycler : ĠRecyclerView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġno Messages : ĠTextView ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġchat Adapter : ĠChat Adapter ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrandom UID Generator : ĠRandom UID Generator ĊĊĠĠĠ Ġprivate Ġval Ġview Mode : ĠChat ViewModel Ġby Ġview Models () ĊĊĠĠĠ Ġprivate Ġvar Ġm Connected Device Name : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Connected Device Address : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmy Device Address : ĠString ? Ġ= Ġnull ĊĊĊĠĠĠ Ġprivate Ġvar Ġchat Id Ġ= Ġ"- 1 " ĊĠĠĠ Ġprivate Ġvar Ġm Out StringBuffer : ĠStringBuffer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Bluetooth Adapter : ĠBluetooth Adapter ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġm Chat Service : ĠBluetooth Chat Service ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ Ġcheck For Bluetooth Adapter () ĊĠĠĠĠĠĠĠ Ġchat Id Ġ= Ġrequire Arguments (). getString ( Constants . DEVICE _ ADDRESS , Ġ"") Ġ?: Ġ"- 1 " ĊĠĠĠĠĠĠĠ Ġrandom UID Generator Ġ= ĠRandom UID Generator () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Out EditText Ġ= Ġview . findViewById ( R . id . ed t _ chat F _ message ) ĊĠĠĠĠĠĠĠ Ġm Send Button Ġ= Ġview . findViewById ( R . id . button _ send ) ĊĠĠĠĠĠĠĠ Ġconnection State Ġ= Ġview . findViewById ( R . id . btn _ chat F _ connection State ) ĊĠĠĠĠĠĠĠ Ġre cycler Ġ= Ġview . findViewById ( R . id . recycler _ chat F _ items ) ĊĠĠĠĠĠĠĠ Ġno Messages Ġ= Ġview . findViewById ( R . id . txt _ chat F _ no Message ) ĊĠĠĠĠĠĠĠ Ġinit RecyclerView () ĊĠĠĠĠĠĠĠ Ġsubscribe On Buttons () ĊĠĠĠĠĠĠĠ Ġsubscribe On Chat Messages () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress Lint (" Hardware Ids ") ĊĠĠĠ Ġprivate Ġfun Ġcheck For Bluetooth Adapter () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Bluetooth Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Bluetooth Adapter Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivity : ĠFragment Activity Ġ= Ġrequire Activity () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( activity , Ġ" Bluetooth Ġis Ġnot Ġavailable ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . finish () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Bluetooth Adapter ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Device Address Ġ= Ġit . address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit RecyclerView () Ġ{ ĊĠĠĠĠĠĠĠ Ġre cycler . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( require Context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Adapter Ġ= ĠChat Adapter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadapter Ġ= Ġchat Adapter ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe On Buttons () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection State . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnect Device () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsubscribe On Chat Messages () Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . Main ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Mode . getAll Messages ( chat Id )?. collect Ġ{ Ġmessages Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Messages ( messages ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" get Chat History : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Status ( state Ġ: ĠString ){ ĊĠĠĠĠĠĠĠ Ġconnection State . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġstate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Messages ( messages : ĠList < com . sa ur ab h . bluetooth chat app . chat . Message ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( messages . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Empty Message View ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Adapter . submit List ( messages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre cycler . smooth Scroll To Position ( messages . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( messages . isEmpty ()) Ġshow Empty Message View ( true ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġshow Empty Message View ( show Ġ: Boolean ){ ĊĠĠĠĠĠĠĠ Ġno Messages . isVisible Ġ= Ġshow ĊĠĠĠĠĠĠĠ Ġre cycler . isVisible Ġ= Ġ! show ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Chat () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Send Button . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview : ĠView ? Ġ= Ġview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġview ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠtextView Ġ= Ġview . findViewById < View >( R . id . ed t _ chat F _ message ) Ġas ĠTextView ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= ĠtextView . text . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm Ġ= ĠMessage Ack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Status . Message Status None (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrandom UID Generator . generate (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( m ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Chat Service Ġ= ĠBluetooth Chat Service ( require Context (), Ġm Handler ) ĊĠĠĠĠĠĠĠ Ġm Out StringBuffer Ġ= ĠStringBuffer ("") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinsert Message ( ĊĠĠĠĠĠĠĠ Ġwrite Message : ĠString , ĊĠĠĠĠĠĠĠ Ġchat Id : ĠString , ĊĠĠĠĠĠĠĠ Ġu Id : ĠString , ĊĠĠĠĠĠĠĠ Ġsender Id : ĠString , ĊĠĠĠĠĠĠĠ Ġstatus Ġ: Message Status , ĊĠĠĠĠĠĠĠ Ġis Me : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġfather Id : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġview Mode . insert Message ( write Message , Ġchat Id , Ġu Id , Ġsender Id , Ġis Me , Ġfather Id , status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠsendMessage ( message : ĠMessage Ack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Chat Service !!. state Ġ!= ĠBluetooth Chat Service . STATE _ CONNECTED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content . isNotEmpty ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( content , chat Id , UID , chat Id , status , true ,- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Out EditText . setText ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwrite Message ( message ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġwrite Message ( message Ġ: ĠMessage Ack ){ ĊĠĠĠĠĠĠĠ Ġif Ġ( message . content . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsend Ġ= Ġmessage . encode (). toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Chat Service !!. write ( send ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Out StringBuffer !!. set Length ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Out EditText . setText ( m Out StringBuffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Connect Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection State . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġhandle Failed Messages () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Failed Messages () Ġ{ ĊĠĠĠĠĠĠĠ ĠCor outine Scope ( Dispatch ers . IO ). launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= Ġview Mode . get My Failed Messages ( chat Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( messages . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessages . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Failed Messages : Ġ${ it ?. content () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit ?. let Ġ{ Ġmessage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage Ack ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠMessage Status . Message Status Send (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUID Ġ= Ġmessage . content (). u Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġmessage . content (). content ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Write Message ( m Ack : ĠMessage Ack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ack . status Ġ== ĠMessage Status . Message Status None ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Message ( m Ack . content , Ġchat Id , Ġm Ack . UID , Ġmy Device Address !! , Message Status . Message Status Send (), Ġtrue , Ġ- 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Read Message ( read Message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġm Ack Ġ= Ġread Message . decode () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Ack . status Ġ== ĠMessage Status . Message Status Seen ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate My Message Status ( m Ack ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Read Message : Ġhas lk df jl ad sf ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" handle Read Message : Ġ$ read Message ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstore The ir Message ( m Ack ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Ack ( m Ack ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate My Message Status ( m Ack : ĠMessage Ack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Ack . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Mode . update My Message Status ( status , ĠUID , Ġcontent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstore The ir Message ( m Ack : ĠMessage Ack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinsert Message ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Message Ġ= Ġm Ack . content , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchat Id Ġ= Ġchat Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġu Id Ġ= Ġm Ack . UID , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender Id Ġ= Ġm Connected Device Address !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Me Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfather Id Ġ= Ġ- 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠMessage Status . Message Status Send () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Ack ( message : ĠMessage Ack ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage . is Me Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġmessage . status Ġ= ĠMessage Status . Message Status Seen () ĊĠĠĠĠĠĠĠ ĠsendMessage ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġm Handler : ĠHandler Ġ= Ġobject Ġ: ĠHandler ( Looper . get Main Looper ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Message ( msg : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( msg . what ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . MESSAGE _ STATE _ CHANGE Ġ-> Ġwhen Ġ( msg . arg 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Chat Service . STATE _ CONNECTED Ġ-> Ġhandle Connect Status () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Chat Service . STATE _ CONNECT ING Ġ-> Ġchange Status ( resources . getString ( R . string . title _ connecting )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Chat Service . STATE _ LIST EN , ĠBluetooth Chat Service . STATE _ NONE Ġ-> Ġchange Status ( resources . getString ( R . string . title _ not _ connected )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . MESSAGE _ WRITE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Buf Ġ= Ġmsg . obj Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrite Message Ġ= ĠString ( write Buf ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġwrite Message . decode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Write Message ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . MESSAGE _ READ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Buf Ġ= Ġmsg . obj Ġas ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Message Ġ= ĠString ( read Buf , Ġ 0 , Ġmsg . arg 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Read Message ( read Message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . MESSAGE _ DEVICE _ NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Device Name Ġ= Ġmsg . data . getString ( Constants . DEVICE _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Connected Device Address Ġ= Ġmsg . data . getString ( Constants . DEVICE _ ADDRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchat Id Ġ= Ġm Connected Device Address Ġ?: Ġ"- 1 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( require Context (), Ġ" Connected Ġto Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġm Connected Device Name , ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstants . MESSAGE _ TO AST Ġ-> ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), Ġmsg . data . getString ( Constants . TO AST ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( request Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ CONNECT _ DEVICE _ SECURE Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata ?. let Ġ{ Ġconnect Device () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ ENABLE _ BT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Chat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Ġdid Ġnot Ġenable ĠBluetooth Ġor Ġan Ġerror Ġoccurred ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġ" BT Ġnot Ġenabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context (), ĠR . string . bt _ not _ enabled _ le aving , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . LENGTH _ SHORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġconnect Device () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdevice Ġ= Ġm Bluetooth Adapter !!. get Remote Device ( chat Id ) ĊĠĠĠĠĠĠĠ Ġm Chat Service ?. connect ( device , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ(! m Bluetooth Adapter !!. isEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Intent Ġ= ĠIntent ( Bluetooth Adapter . ACTION _ REQUEST _ ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( enable Intent , ĠREQUEST _ ENABLE _ BT ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( m Chat Service Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Chat () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġm Chat Service ?. stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġif Ġ( m Chat Service Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Chat Service !!. state Ġ== ĠBluetooth Chat Service . STATE _ NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Chat Service !!. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy View () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy View () ĊĠĠĠĠĠĠĠ Ġm Chat Service ?. stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Bluetooth Chat Fragment " ĊĊĠĠĠĠĠĠĠ Ġ// ĠIntent Ġrequest Ġcodes ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ CONNECT _ DEVICE _ SECURE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREQUEST _ ENABLE _ BT Ġ= Ġ 3 ĊĠĠĠ Ġ} Ċ }