package Ġtech . h ombre . bluetooth chat ter . data . service Ċ Ċ import Ġandroid . app . Service Ċ import Ġandroid . app . Task Stack Builder Ċ import Ġandroid . bluetooth . Bluetooth Device Ċ import Ġandroid . content .* Ċ import Ġandroid . os . Binder Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . IB inder Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroidx . core . app . Remote Input Ċ import Ġandroidx . core . net . to Uri Ċ import Ġorg . k oin . android . ext . android . inject Ċ import Ġorg . k oin . core . parameter . parameters Of Ċ import Ġtech . h ombre . bluetooth chat ter . R Ċ import Ġtech . h ombre . bluetooth chat ter . data . entity . ChatMessage Ċ import Ġtech . h ombre . bluetooth chat ter . data . entity . Conversation Ċ import Ġtech . h ombre . bluetooth chat ter . data . model . On Connection Listener Ċ import Ġtech . h ombre . bluetooth chat ter . data . model . On File Listener Ċ import Ġtech . h ombre . bluetooth chat ter . data . model . On Message Listener Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . connection . Connection Controller Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . connection . Connection Subject Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . message . Contract Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . message . Message Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . message . Payload Type Ċ import Ġtech . h ombre . bluetooth chat ter . data . service . message . Trans f erring File Ċ import Ġtech . h ombre . bluetooth chat ter . ui . activity . MainActivity Ċ import Ġtech . h ombre . bluetooth chat ter . ui . view . Notification View Ċ import Ġjava . io . File Ċ Ċ class ĠBluetooth Connection Service Ġ: ĠService (), ĠConnection Subject Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbinder Ġ= ĠConnection Binder () ĊĊĠĠĠ Ġprivate Ġvar Ġconnection Listener : ĠOn Connection Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmessage Listener : ĠOn Message Listener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġfile Listener : ĠOn File Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġcontroller : ĠConnection Controller Ġby Ġinject Ġ{ ĊĠĠĠĠĠĠĠ Ġparameters Of ( application Ġas Ġtech . h ombre . bluetooth chat ter . Chat Application , Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġconnection Action Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent . getBoolean Extra ( Notification View . EXTRA _ APPRO VED , Ġfalse )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . approve Connection () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġintent . getString Extra ( Notification View . EXTRA _ ADDRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchat Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bluetooth chat ter :// con versations /$ address ". to Uri (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconversations Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" bluetooth chat ter :// con versations ". to Uri (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMainActivity :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTask Stack Builder . create ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Next Intent With Parent Stack ( con versations Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Next Intent With Parent Stack ( chat Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. start Activities () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . reject Connection () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġreply Action Receiver Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( context : ĠContext ?, Ġintent : ĠIntent ?) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRemote Input . get Results From Intent ( intent )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Text Ġ= Ġit . get CharSequence ( Notification View . EXTRA _ TEXT _ REPLY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . reply From Notification ("$ reply Text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ?): ĠI Binder ? Ġ= Ġbinder ĊĊĠĠĠ Ġinner Ġclass ĠConnection Binder Ġ: ĠB inder () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġget Service () Ġ= Ġthis @ Bluetooth Connection Service ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠĠĠĠĠ Ġcontroller . on New Foreground Message Ġ= Ġ{ Ġshow Notification ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġregister Receiver ( connection Action Receiver , ĠIntent Filter ( Notification View . ACTION _ CONNECTION )) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Receiver ( reply Action Receiver , ĠIntent Filter ( Notification View . ACTION _ REPLY )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( intent ?. action Ġ== ĠACTION _ STOP ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontroller . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Destroyed () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSTART _ NOT _ STICK Y ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontroller . prepare For Accept () ĊĠĠĠĠĠĠĠ Ġshow Notification ( getString ( R . string . notification __ ready _ to _ connect )) ĊĠĠĠĠĠĠĠ Ġreturn ĠService . START _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Notification ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotification Ġ= Ġcontroller . create Foreground Notification ( message ) ĊĠĠĠĠĠĠĠ Ġstart Foreground ( FO REG ROUND _ SERVICE , Ġnotification ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġconnect ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . connect ( device ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisconnect () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . disconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Connected () Ġ= Ġcontroller . isConnected () ĊĊĠĠĠ Ġfun Ġis Connected Or Pending () Ġ= Ġcontroller . isConnected Or Pending () ĊĊĠĠĠ Ġfun Ġis Pending () Ġ= Ġcontroller . is Pending () ĊĊĠĠĠ Ġfun ĠgetCurrent Conversation (): ĠCon versation ? Ġ= Ġcontroller . getCurrent Conversation () ĊĊĠĠĠ Ġfun Ġget Trans f erring File (): ĠTrans f erring File ? Ġ= Ġcontroller . get Trans f erring File () ĊĊĠĠĠ Ġfun ĠgetCurrent Contract (): ĠContract Ġ= Ġcontroller . getCurrent Contract () ĊĊĠĠĠ Ġfun ĠsendMessage ( message : ĠMessage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . sendMessage ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsend File ( file : ĠFile , Ġtype : ĠPayload Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . send File ( file , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġapprove Connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . approve Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreject Connection () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . reject Connection () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcancel File Transfer () Ġ{ ĊĠĠĠĠĠĠĠ Ġcontroller . cancel File Transfer () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Running () Ġ= Ġis Running ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connected Out ( conversation : ĠCon versation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connected Out ( conversation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connected In ( conversation : ĠCon versation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connected In ( conversation ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connection Accepted () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Accepted () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connected ( device : ĠBluetooth Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connected ( device ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connecting InProgress () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connecting () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Disconnected () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Disconnected () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connection Rejected () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Rejected () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connection Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connection Lost () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Lost () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Connection Withdraw n () Ġ{ ĊĠĠĠĠĠĠĠ Ġconnection Listener ?. on Connection Withdraw n () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Sending Started ( file Address : ĠString ?, ĠfileSize : ĠLong , Ġtype : ĠPayload Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Sending Started ( file Address , ĠfileSize , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Sending Progress ( sent Bytes : ĠLong , Ġtotal Bytes : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Sending Progress ( sent Bytes , Ġtotal Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Sending Finished () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Sending Finished () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Sending Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Sending Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Re ceiving Started ( file Size : ĠLong , Ġtype : ĠPayload Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Re ceiving Started ( file Size , Ġtype ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Re ceiving Progress ( sent Bytes : ĠLong , Ġtotal Bytes : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Re ceiving Progress ( sent Bytes , Ġtotal Bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Re ceiving Finished () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Re ceiving Finished () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Re ceiving Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Re ceiving Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle File Transfer Canceled ( by Partner : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Listener ?. on File Transfer Canceled ( by Partner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Received ( message : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Received ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Sent ( message : ĠChat Message ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Sent ( message ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Sending Failed () Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Sending Failed () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Deliver ed ( uid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Deliver ed ( uid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Not Deliver ed ( uid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Not Deliver ed ( uid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Message Seen ( uid : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmessage Listener ?. on Message Seen ( uid ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Any body Listening For Messages () Ġ= Ġmessage Listener Ġ!= Ġnull ĊĊĠĠĠ Ġfun Ġset Connection Listener ( listener : ĠOn Connection Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connection Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Message Listener ( listener : ĠOn Message Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . message Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset File Listener ( listener : ĠOn File Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . file Listener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĊĠĠĠĠĠĠĠ Ġunregister Receiver ( connection Action Receiver ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunregister Receiver ( reply Action Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġis Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcontroller . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Running Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFO REG ROUND _ SERVICE Ġ= Ġ 1 0 1 ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠACTION _ STOP Ġ= Ġ" action . stop " ĊĊĠĠĠĠĠĠĠ Ġfun Ġstart ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠBluetooth Connection Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Foreground Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . start Service ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġbind ( context : ĠContext , Ġconnection : ĠService Connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( context , ĠBluetooth Connection Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . bind Service ( intent , Ġconnection , ĠAppCompatActivity . BIND _ AB O VE _ CLIENT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ