package Ġcom . tut pro . ba res ip Ċ Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app .* Ċ import Ġandroid . app . Notification . VIS IBILITY _ PUBLIC Ċ import Ġandroid . app . Pending Intent . getActivity Ċ import Ġandroid . bluetooth . Bluetooth Adapter Ċ import Ġandroid . bluetooth . Bluetooth Head set Ċ import Ġandroid . content .* Ċ import Ġandroid . media .* Ċ import Ġandroid . net .* Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os .* Ċ import Ġandroid . support . annotation . Keep Ċ import Ġandroid . support . v 4 . app . Notification Compat Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Remote Views Ċ import Ġandroid . support . v 4 . content . Local Broadcast Manager Ċ import Ġandroid . support . v 4 . app . Notification Compat . VIS IBILITY _ PRIVATE Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . tele phony . Tele phony Manager Ċ Ċ import Ġjava . io . File Ċ import Ġjava . net . Inet Address Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util .* Ċ import Ġkotlin . concurrent . schedule Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠB ares ip Service : ĠService () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠLOG _ TAG Ġ= Ġ" B ares ip ĠService " ĊĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġintent : ĠIntent ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġam : ĠAudio Manager ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġrt : ĠRing tone ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġnt : ĠRing tone ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġnm : ĠNotification Manager ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġs nb : ĠNotification Compat . Builder ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġcm : ĠConnect ivity Manager ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġpm : ĠPower Manager ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġtm : ĠTele phony Manager ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġpartial Wake Lock : ĠPower Manager . Wake Lock ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġprox imity Wake Lock : ĠPower Manager . Wake Lock ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġfl : ĠW ifi Manager . Wifi Lock ĊĠĠĠ Ġinternal Ġlateinit Ġvar Ġbr : ĠBroadcast Receiver ĊĊĠĠĠ Ġinternal Ġvar Ġrt Timer : ĠTimer ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġaudio Focus Request : ĠAudio Focus Request ? Ġ= Ġnull ĊĠĠĠ Ġinternal Ġvar Ġaudio Focused Ġ= Ġfalse ĊĠĠĠ Ġinternal Ġvar Ġorig Call Volume Ġ= Ġ- 1 ĊĠĠĠ Ġinternal Ġval Ġbt Adapter Ġ= ĠBluetooth Adapter . getDefault Adapter () ĊĠĠĠ Ġinternal Ġvar Ġactive Network : ĠNetwork ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate () Ġ{ ĊĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" At ĠonCreate ") ĊĊĠĠĠĠĠĠĠ Ġintent Ġ= ĠIntent (" com . tut pro . ba res ip . EVENT ") ĊĠĠĠĠĠĠĠ Ġintent . set Package (" com . tut pro . ba res ip ") ĊĊĠĠĠĠĠĠĠ Ġfiles Path Ġ= Ġfiles Dir . absolute Path ĊĠĠĠĠĠĠĠ Ġdownloads Path Ġ= ĠEnvironment . get External Storage Public Directory ( Environment . DIRECTORY _ DOWNLOAD S ). path ĊĊĠĠĠĠĠĠĠ Ġam Ġ= Ġget System Service ( Context . AUDIO _ SERVICE ) Ġas ĠAudio Manager ĊĊĠĠĠĠĠĠĠ Ġval Ġrt Uri Ġ= ĠRing tone Manager . get Actual Default Ring tone Uri ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRing tone Manager . TYPE _ RING T ONE ) ĊĠĠĠĠĠĠĠ Ġrt Ġ= ĠRing tone Manager . get Ring tone ( application Context , Ġrt Uri ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnt Uri Ġ= ĠRing tone Manager . get Actual Default Ring tone Uri ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRing tone Manager . TYPE _ NOTIFICATION ) ĊĠĠĠĠĠĠĠ Ġnt Ġ= ĠRing tone Manager . get Ring tone ( application Context , Ġnt Uri ) ĊĊĠĠĠĠĠĠĠ Ġnm Ġ= Ġget System Service ( NOTIFICATION _ SERVICE ) Ġas ĠNotification Manager ĊĠĠĠĠĠĠĠ Ġcreate Notification Channels () ĊĠĠĠĠĠĠĠ Ġs nb Ġ= ĠNotification Compat . Builder ( this , ĠDEFAULT _ CHANNEL _ ID ) ĊĊĠĠĠĠĠĠĠ Ġcm Ġ= Ġget System Service ( Context . CONNECT IVITY _ SERVICE ) Ġas ĠConnect ivity Manager ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠNetwork Request . Builder () ĊĠĠĠĠĠĠĠ Ġcm . register Network Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . build (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠConnect ivity Manager . Network Callback () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Available ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Available ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Properties Ġ= Ġcm . get Link Properties ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" Network Ġ$ network Ġis Ġavailable : Ġ'$ link Properties '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Network Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( LOG _ TAG , Ġ" Updating Ġdns Servers Ġand Ġlink Addresses ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Network Ġ= Ġnetwork ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdns Servers Ġ= Ġlink Properties . dns Servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink Addresses Ġ= Ġlink Properties . link Addresses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Lost ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Network Ġ== Ġnetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Active Ġnetwork Ġ'$ network ' Ġis Ġlost ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Network Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( net Ġin Ġcm . all Networks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( net Ġ!= Ġnetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" New Ġnetwork Ġ$ net Ġis Ġavailable ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Network Ġ= Ġnet ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Network Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Properties Ġ= Ġcm . get Link Properties ( active Network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dyn Dns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdns Servers Ġ= Ġlink Properties . dns Servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Config . update Dns Servers ( dns Servers ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" Failed Ġto Ġupdate ĠDNS Ġservers Ġ'$ dns Servers '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink Addresses Ġ= Ġlink Properties . link Addresses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . update Link Addresses () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Agent . register () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Network Ġ'$ network ' Ġis Ġlost ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Link Properties Changed ( network : ĠNetwork , Ġlink Properties : ĠLink Properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Link Properties Changed ( network , Ġlink Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Service Running ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( network Ġ== Ġactive Network ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Active Ġnetwork Ġ$ network Ġlink Ġproperties Ġchanged : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ link Properties ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dyn Dns ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdns Servers Ġ= Ġlink Properties . dns Servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Config . update Dns Servers ( dns Servers ) Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" Failed Ġto Ġupdate ĠDNS Ġservers Ġ'$ dns Servers '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlink Addresses Ġ= Ġlink Properties . link Addresses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . update Link Addresses () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUser Agent . register () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Network Ġ$ network Ġlink Ġproperties Ġchanged : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ link Properties ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġpm Ġ= Ġget System Service ( Context . POWER _ SERVICE ) Ġas ĠPower Manager ĊĊĠĠĠĠĠĠĠ Ġtm Ġ= Ġget System Service ( Context . TELE PHONY _ SERVICE ) Ġas ĠTele phony Manager ĊĊĠĠĠĠĠĠĠ Ġpartial Wake Lock Ġ= Ġpm . new Wake Lock ( Power Manager . PAR TIAL _ WAKE _ LOCK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . tut pro . ba res ip : partial _ wake log ") ĊĠĠĠĠĠĠĠ Ġpartial Wake Lock . acquire () ĊĊĠĠĠĠĠĠĠ Ġprox imity Wake Lock Ġ= Ġpm . new Wake Lock ( Power Manager . PRO X IM ITY _ SCREEN _ OFF _ WAKE _ LOCK , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . tut pro . ba res ip : prox imity _ wake log ") ĊĊĠĠĠĠĠĠĠ Ġbr Ġ= Ġobject Ġ: ĠBroadcast Receiver () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Receive ( ctx : ĠContext , Ġintent : ĠIntent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( intent . action ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . ACTION _ CONNECTION _ STATE _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Head set . EXTRA _ STATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set Ġis Ġconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Audio Focused ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWithout Ġdelay , ĠSCO _ AUDIO _ STATE _ CONNECT ING Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSCO _ AUDIO _ STATE _ DIS CONNECTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTimer (" S co ", Ġfalse ). schedule ( 1 0 0 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Starting ĠBluetooth ĠSCO ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . start Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set Ġis Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . is Bluetooth S co On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Stopping ĠBluetooth ĠSCO ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . stop Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . ACTION _ AUDIO _ STATE _ CHANGED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Bluetooth Head set . EXTRA _ STATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ AUDIO _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ AUDIO _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set Ġaudio Ġis Ġconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ AUDIO _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set Ġaudio Ġis Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . is Bluetooth S co On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Stopping ĠBluetooth ĠSCO ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . stop Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . ACTION _ SCO _ AUDIO _ STATE _ UPDATED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġintent . getInt Extra ( Audio Manager . EXTRA _ SCO _ AUDIO _ STATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . SCO _ AUDIO _ STATE _ DIS CONNECTED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . SCO _ AUDIO _ STATE _ CONNECT ING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set ĠSCO Ġis Ġconnecting ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . SCO _ AUDIO _ STATE _ CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set ĠSCO Ġis Ġconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . SCO _ AUDIO _ STATE _ DIS CONNECTED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set ĠSCO Ġis Ġdisconnected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaband on Audio Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . SCO _ AUDIO _ STATE _ ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Bluetooth Ġhead set ĠSCO Ġstate ĠERROR ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( bt Adapter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠIntent Filter () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . addAction ( Bluetooth Head set . ACTION _ CONNECTION _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . addAction ( Bluetooth Head set . ACTION _ AUDIO _ STATE _ CHANGED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter . addAction ( Audio Manager . ACTION _ SCO _ AUDIO _ STATE _ UPDATED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . register Receiver ( br , Ġfilter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuper . onCreate () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart Command ( intent : ĠIntent ?, Ġflags : ĠInt , Ġstart Id : ĠInt ): ĠInt Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġaction : ĠString ĊĊĠĠĠĠĠĠĠ Ġif Ġ( intent Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġ" Start " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Received ĠonStart Command Ġwith Ġnull Ġintent ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUtils . dump Intent ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġintent . action !! ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Received ĠonStart Command Ġaction Ġ$ action ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( action ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Start " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwm Ġ= Ġapplication Context . getSystem Service ( Context . WIFI _ SERVICE ) Ġas ĠW ifi Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfl Ġ= Ġwm . create Wifi Lock ( Wifi Manager . WIFI _ MODE _ FULL _ HIGH _ PERF , Ġ" B ares ip ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġassets Ġ= ĠarrayOf (" accounts ", Ġ" config ", Ġ" contacts ", Ġ" busy . wav ", Ġ" call waiting . wav ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" error . wav ", Ġ" not found . wav ", Ġ" ring . wav ", Ġ" ring back . wav ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile Ġ= ĠFile ( files Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Creating Ġb ares ip Ġdirectory ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( files Path ). mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠError ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( LOG _ TAG , Ġ" Failed Ġto Ġcreate Ġdirectory : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( a Ġin Ġassets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ("${ files Path }/ $ a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Copy ing Ġasset Ġ'$ a '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . copy Asset ToFile ( application Context , Ġa , Ġ"$ files Path /$ a ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Asset Ġ'$ a ' Ġalready Ġcopied ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a Ġ== Ġ" config ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . initialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( files Dir , Ġ" history "). exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( files Dir , Ġ" history "). rename To ( File ( files Dir , Ġ" calls ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . restore () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMessage . restore () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( Runnable Ġ{ Ġb ares ip Start ( files Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . find Ip V 4 Address ( link Addresses ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . find Ip V 6 Address ( link Addresses ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefer Ip V 6 ) Ġ}). start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Service Running Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Status Notification () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Accounts Activity . no Accounts ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" action ", Ġ" accounts ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call ĠShow ", Ġ" Call ĠAnswer " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" action ", Ġaction . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" call p ", Ġintent !!. getString Extra (" call p ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Call ĠReject " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall p Ġ= Ġintent !!. getString Extra (" call p ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" onStart Command Ġdid Ġnot Ġfind Ġcall Ġ$ call p ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeer Uri Ġ= Ġcall . peer URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa or Ġ= Ġcall . ua . account . a or ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" A or Ġ$ a or Ġrejected Ġincoming Ġcall Ġ$ call p Ġfrom Ġ$ peer Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . ua _ hang up ( call . ua . u ap , Ġcall p , Ġ 4 8 6 , Ġ" Rejected ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . ua . account . call History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . add ( Call History ( a or , Ġpeer Uri , Ġ" in ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Transfer ĠShow ", Ġ" Transfer ĠAccept " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu ap Ġ= Ġintent !!. getString Extra (" u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent . find ( u ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" onStart Command Ġdid Ġnot Ġfind Ġua Ġ$ u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" action ", Ġaction . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" call p ", Ġintent . getString Extra (" call p ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" uri ", Ġintent . getString Extra (" uri ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( B ares ip Service . TRANSFER _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Transfer ĠDen y " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall p Ġ= Ġintent !!. getString Extra (" call p ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" onStart Command Ġdid Ġnot Ġfind Ġcall Ġ$ call p ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . call _ notify _ sip frag ( call p , Ġ 6 0 3 , Ġ" Decl ine ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( B ares ip Service . TRANSFER _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Message ĠShow ", Ġ" Message ĠReply " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" action ", Ġaction . toLowerCase ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" u ap ", Ġintent !!. getString Extra (" u ap ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" peer ", Ġintent . getString Extra (" peer ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( B ares ip Service . MESSAGE _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Message ĠSave " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu ap Ġ= Ġintent !!. getString Extra (" u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent . find ( u ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" onStart Command Ġdid Ġnot Ġfind ĠU A Ġ$ u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ats Activity . save Ua Message ( ua . account . a or , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getString Extra (" time "). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( B ares ip Service . MESSAGE _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Message ĠDelete " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu ap Ġ= Ġintent !!. getString Extra (" u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent . find ( u ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" onStart Command Ġdid Ġnot Ġfind ĠU A Ġ$ u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCh ats Activity . delete Ua Message ( ua . account . a or , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . getString Extra (" time "). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( B ares ip Service . MESSAGE _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Update Notification " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status Notification () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Toggle Speaker " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" To g gling Ġspeaker phone Ġfrom Ġ$ speaker Phone ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . is Speaker phone On Ġ= Ġ! am . is Speaker phone On ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeaker Phone Ġ= Ġam . is Speaker phone On ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Prox imity S ensing " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity S ensing ( intent !!. getBoolean Extra (" enable ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Stop ", Ġ" Stop ĠForce " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Service Clean ) Ġclean Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Service Running ) Ġb ares ip Stop ( action Ġ== Ġ" Stop ĠForce ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kill " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Service Clean ) Ġclean Service () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Service Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSTART _ STICK Y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ( intent : ĠIntent ): ĠI Binder ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" At ĠB ares ip ĠService Ġon Destroy ") ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġthis . unregister Receiver ( br ) ĊĠĠĠĠĠĠĠ Ġif Ġ( am . is Bluetooth S co On ) Ġam . stop Bluetooth S co () ĊĠĠĠĠĠĠĠ Ġclean Service () ĊĠĠĠĠĠĠĠ Ġif Ġ( is Service Running ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbroadcast Intent Ġ= ĠIntent (" com . tut pro . ba res ip . Restart ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend Broadcast ( broadcast Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġua Add ( u ap : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" ua Add Ġat ĠB ares ip Service ") ĊĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent ( u ap ) ĊĠĠĠĠĠĠĠ Ġu as . add ( ua ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Api . ua _ is registered ( u ap )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ua Ġ${ ua . account . a or } Ġis Ġregistered ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . add ( R . drawable . dot _ green ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ua Ġ${ ua . account . a or } Ġis ĠNOT Ġregistered ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus . add ( R . drawable . dot _ yellow ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" service Ġevent ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" event ", Ġ" ua Ġadded ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" params ", Ġarray ListOf ( u ap )) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). send Broadcast ( intent ) ĊĠĠĠĠĠĠĠ Ġupdate Status Notification () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġua Event ( event : ĠString , Ġu ap : ĠString , Ġcall p : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" ua Event Ġgot Ġevent Ġ$ event /$ u ap /$ call p ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Service Running ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent . find ( u ap ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" ua Event Ġdid Ġnot Ġfind Ġua Ġ$ u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġa or Ġ= Ġua . account . a or ĊĠĠĠĠĠĠĠ Ġvar Ġnew Event : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġev Ġ= Ġevent . split (",") ĊĠĠĠĠĠĠĠ Ġfor Ġ( account _ index Ġin Ġu as . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( u as [ account _ index ]. account . a or Ġ== Ġa or ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( ev [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" register ing " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" registered " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua . account . reg int Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus [ account _ index ] Ġ= ĠR . drawable . dot _ yellow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus [ account _ index ] Ġ= ĠR . drawable . dot _ green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġua . registration Failed Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" register ing Ġfailed " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus [ account _ index ] Ġ= ĠR . drawable . dot _ red ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( ev . size Ġ> Ġ 1 ) Ġ&& Ġ( ev [ 1 ] Ġ== Ġ" Invalid Ġargument ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMost Ġlikely Ġthis Ġerror Ġis Ġdue Ġto ĠDNS Ġlookup Ġfailure ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Event Ġ= Ġ" register ing Ġfailed , DNS Ġlookup Ġfailed " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . net _ dns _ debug () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dyn Dns ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactive Network Ġ= Ġcm . active Network ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Network Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdns Servers Ġ= Ġcm . get Link Properties ( active Network ). dns Servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Updating ĠDNS ĠServer s Ġ= Ġ$ dns Servers ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Config . update Dns Servers ( dns Servers ) Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" Failed Ġto Ġupdate ĠDNS Ġservers Ġ'$ dns Servers '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . net _ dns _ debug () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ua . registration Failed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġua . registration Failed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . ua _ register ( u ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" No Ġactive Ġnetwork !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" unregister ing " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus [ account _ index ] Ġ= ĠR . drawable . dot _ yellow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Status Notification () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġprogress ", Ġ" call Ġring ing " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Audio Focused ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Audio Focus ( Audio Manager . STREAM _ VOICE _ CALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Call Volume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġincoming " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpeer Uri Ġ= ĠApi . call _ peer uri ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( Call . calls (). size Ġ> Ġ 0 ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( tm . call State Ġ!= ĠTele phony Manager . CALL _ STATE _ IDLE ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! Utils . check Permission ( application Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . Manifest . permission . RECORD _ AUDIO )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Auto - reject ing Ġincoming Ġcall Ġ$ u ap /$ call p /$ peer Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . ua _ hang up ( u ap , Ġcall p , Ġ 4 8 6 , Ġ" Busy ĠHere ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua . account . call History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . add ( Call History ( a or , Ġpeer Uri , Ġ" in ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġua . account . missed Calls Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Event Ġ= Ġ" call Ġrejected " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Incoming Ġcall Ġ$ u ap /$ call p /$ peer Uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls . add ( Call ( call p , Ġua , Ġpeer Uri , Ġ" in ", Ġ" incoming ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . dt mf Watcher ( call p ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua . account . answer Mode Ġ== Ġ" manual ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Current Inter ruption Filter Ġ${ nm . current Inter ruption Filter }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nm . current Inter ruption Filter Ġ<= ĠNotification Manager . INTERRUP TION _ FILTER _ ALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ring ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ring ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Intent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP Ġor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" action ", Ġ" call Ġanswer ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Intent . putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( new Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= Ġ" Call ĠShow " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getService ( this , ĠCALL _ REQ _ CODE , Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnb Ġ= ĠNotification Compat . Builder ( this , ĠHIGH _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaller Ġ= ĠUtils . friendly Uri ( Contacts Activity . contact Name ( peer Uri ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . a or Domain ( a or )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set Small Icon ( R . drawable . ic _ stat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . color . color B ares ip )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Category ( Notification . CATEGORY _ CALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . incoming _ call _ from )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( caller ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set V ibrate ( Long Array ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setVisibility ( VIS IBILITY _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification . PRIORITY _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswer Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Intent . action Ġ= Ġ" Call ĠAnswer " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanswer Intent . putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswer Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAN SW ER _ REQ _ CODE , Ġanswer Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreject Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject Intent . action Ġ= Ġ" Call ĠReject " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreject Intent . putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreject Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE JECT _ REQ _ CODE , Ġreject Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , ĠgetString ( R . string . answer ), Ġanswer Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , ĠgetString ( R . string . reject ), Ġreject Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . notify ( CALL _ NOTIFICATION _ ID , Ġnb . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġestablished " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( CALL _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" Call Ġ$ call p Ġthat Ġis Ġestablished Ġis Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ao R Ġ$ a or Ġcall Ġ$ call p Ġestablished ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . status Ġ= Ġ" connected " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . on hold Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua . account . call History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . add ( Call History ( a or , Ġcall . peer URI , Ġcall . dir , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . has History Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ring ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . mode Ġ= ĠAudio Manager . MODE _ IN _ COMM UN ICATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Audio Focused ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Audio Focus ( Audio Manager . STREAM _ VOICE _ CALL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Call Volume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġverified ", Ġ" call Ġsecure " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w (" B ares ip ", Ġ" Call Ġ$ call p Ġthat Ġis Ġverified Ġis Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ev [ 0 ] Ġ== Ġ" call Ġsecure ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . security Ġ= ĠR . drawable . box _ yellow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . security Ġ= ĠR . drawable . box _ green ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . z id Ġ= Ġev [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġtransfer " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" Call Ġ$ call p Ġto Ġbe Ġtransferred Ġis Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= Ġ" Transfer ĠShow " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" uri ", Ġev [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getService ( this , ĠTRANS FER _ REQ _ CODE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġintent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnb Ġ= ĠNotification Compat . Builder ( this , ĠHIGH _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠUtils . friendly Uri ( Contacts Activity . contact Name ( ev [ 1 ]), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . a or Domain ( a or )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set Small Icon ( R . drawable . ic _ stat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( this , ĠR . color . color B ares ip )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Defaults ( Notification . DEFAULT _ SOUND ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . transfer _ request )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set V ibrate ( Long Array ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setVisibility ( VIS IBILITY _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification . PRIORITY _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccept Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Intent . action Ġ= Ġ" Transfer ĠAccept " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Intent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" uri ", Ġev [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccept Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAC CEPT _ REQ _ CODE , Ġaccept Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeny Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeny Intent . action Ġ= Ġ" Transfer ĠDen y " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeny Intent . putExtra (" call p ", Ġcall p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeny Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠD EN Y _ REQ _ CODE , Ġdeny Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , ĠgetString ( R . string . accept ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , ĠgetString ( R . string . deny ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeny Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . notify ( TRANSFER _ NOTIFICATION _ ID , Ġnb . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" call Ġclosed " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel ( CALL _ NOTIFICATION _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠCall . find ( call p ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ao R Ġ$ a or Ġcall Ġ$ call p Ġthat Ġis Ġclosed Ġis Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ao R Ġ$ a or Ġcall Ġ$ call p Ġis Ġclosed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstop Ring ing () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalls . remove ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Call . calls (). size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreset Call Volume () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . mode Ġ= ĠAudio Manager . MODE _ NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . is Speaker phone On ) Ġam . is Speaker phone On Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . is Bluetooth S co On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Stopping ĠBluetooth ĠSCO ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . stop Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaband on Audio Focus () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspeaker Phone Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity S ensing ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ua . account . call History Ġ&& Ġ! call . has History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . add ( Call History ( a or , Ġcall . peer URI , Ġcall . dir , Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall History . save () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . dir Ġ== Ġ" in ") Ġua . account . missed Calls Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" transfer Ġfailed " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ao R Ġ$ a or Ġh anging Ġup Ġcall Ġ$ call p Ġwith Ġ${ ev [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApi . ua _ hang up ( u ap , Ġcall p , Ġ 0 , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Event Ġ== Ġnull ) Ġnew Event Ġ= Ġevent ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" service Ġevent ") ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" event ", Ġnew Event ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" params ", Ġarray ListOf ( u ap , Ġcall p )) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġmessage Event ( u ap : ĠString , Ġpeer : ĠString , Ġmsg : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtext Ġ= Ġ" De coding Ġof Ġmessage Ġfailed !" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= ĠString ( msg , ĠStandard Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" UTF - 8 Ġdecode Ġfailed ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġua Ġ= ĠUser Agent . find ( u ap ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ua Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . w ( LOG _ TAG , Ġ" message Event Ġdid Ġnot Ġfind Ġua Ġ$ u ap ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtime Stamp Ġ= ĠSystem . currentTimeMillis (). toString () ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Message Ġevent Ġfor Ġ$ u ap Ġfrom Ġ$ peer Ġat Ġ$ time Stamp ") ĊĠĠĠĠĠĠĠ ĠMessage . add ( Message ( ua . account . a or , Ġpeer , Ġtext , Ġtime Stamp . to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . drawable . arrow _ down _ green , Ġ 0 , Ġ"", Ġtrue )) ĊĠĠĠĠĠĠĠ ĠMessage . save () ĊĠĠĠĠĠĠĠ Ġua . account . unread Messages Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ(! Utils . isVisible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . action Ġ= Ġ" Message ĠShow " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" peer ", Ġpeer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠPending Intent . getService ( this , ĠMESSAGE _ REQ _ CODE , Ġintent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnb Ġ= ĠNotification Compat . Builder ( this , ĠHIGH _ CHANNEL _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsender Ġ= ĠUtils . friendly Uri ( Contacts Activity . contact Name ( peer ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . a or Domain ( ua . account . a or )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set Small Icon ( R . drawable . ic _ stat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setColor ( Context Compat . getColor ( this , ĠR . color . color B ares ip )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Sound ( Settings . System . DEFAULT _ NOTIFICATION _ URI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAuto Cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Title ( getString ( R . string . message _ from ) Ġ+ Ġ" Ġ" Ġ+ Ġsender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Text ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnb . set V ibrate ( Long Array ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setVisibility ( VIS IBILITY _ PRIVATE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Priority ( Notification . PRIORITY _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreply Intent . action Ġ= Ġ" Message ĠReply " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreply Intent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" peer ", Ġpeer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreply Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRE PLY _ REQ _ CODE , Ġreply Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsave Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Intent . action Ġ= Ġ" Message ĠSave " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Intent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" time ", Ġtime Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsave Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSAVE _ REQ _ CODE , Ġsave Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Intent Ġ= ĠIntent ( this , ĠB ares ip Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Intent . action Ġ= Ġ" Message ĠDelete " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Intent . putExtra (" u ap ", Ġu ap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. putExtra (" time ", Ġtime Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdelete Pending Intent Ġ= ĠPending Intent . getService ( this , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDELETE _ REQ _ CODE , Ġdelete Intent , ĠPending Intent . FLAG _ UPDATE _ CURRENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , Ġ" Reply ", Ġreply Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , Ġ" Save ", Ġsave Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnb . addAction ( R . drawable . ic _ stat , Ġ" Delete ", Ġdelete Pending Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnm . notify ( MESSAGE _ NOTIFICATION _ ID , Ġnb . build ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnt . play () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" service Ġevent ") ĊĠĠĠĠĠĠĠ Ġintent . flags Ġ= ĠIntent . FLAG _ ACTIVITY _ SINGLE _ TOP Ġor ĠIntent . FLAG _ ACTIVITY _ CLEAR _ TOP ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" event ", Ġ" message Ġshow ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" params ", Ġarray ListOf ( u ap , Ġpeer )) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġmessage Response ( response Code : ĠInt , Ġresponse Reason : ĠString , Ġtime : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Message Ġresponse Ġ'$ response Code Ġ$ response Reason ' Ġat Ġ$ time ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" message Ġresponse ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" response Ġcode ", Ġresponse Code ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" response Ġreason ", Ġresponse Reason ) ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" time ", Ġtime ) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). send Broadcast ( intent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Keep ĊĠĠĠ Ġfun Ġstopped ( error : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Received Ġ' stopped ' Ġfrom Ġb ares ip Ġwith Ġparam Ġ'$ error '") ĊĠĠĠĠĠĠĠ Ġis Service Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( error Ġ== Ġ" ua _ init ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . remove Variable (" sip _ listen ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . remove Variable (" sip _ certificate ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠConfig . remove Variable (" sip _ ca file ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (" service Ġevent ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" event ", Ġ" stopped ") ĊĠĠĠĠĠĠĠ Ġintent . putExtra (" params ", Ġarray ListOf ( error )) ĊĠĠĠĠĠĠĠ ĠLocal Broadcast Manager . getInstance ( this ). send Broadcast ( intent ) ĊĠĠĠĠĠĠĠ Ġstop Foreground ( true ) ĊĠĠĠĠĠĠĠ Ġstop Self () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Notification Channels () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdefault Channel Ġ= ĠNotification Channel ( DEFAULT _ CHANNEL _ ID , Ġ" Default ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ LOW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Channel . lock screen Visibility Ġ= ĠVIS IBILITY _ PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnm . create Notification Channel ( default Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhigh Channel Ġ= ĠNotification Channel ( HIGH _ CHANNEL _ ID , Ġ" High ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNotification Manager . IMPORT ANCE _ HIGH ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Channel . lock screen Visibility Ġ= ĠVIS IBILITY _ PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Channel . enable V ibration ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnm . create Notification Channel ( high Channel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshow Status Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( this , ĠMainActivity :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setAction ( Intent . ACTION _ MAIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Category ( Intent . CATEGORY _ LA UNCH ER ) ĊĠĠĠĠĠĠĠ Ġval Ġpi Ġ= ĠgetActivity ( this , ĠSTATUS _ REQ _ CODE , Ġintent , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġs nb . setVisibility ( VIS IBILITY _ PUBLIC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Small Icon ( R . drawable . ic _ stat ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent Intent ( pi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set O ngo ing ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setContent ( Remote Views ( packageName , ĠR . layout . status _ notification )) ĊĠĠĠĠĠĠĠ Ġstart Foreground ( STATUS _ NOTIFICATION _ ID , Ġs nb . build ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Status Notification () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent View Ġ= ĠRemote Views ( get PackageName (), ĠR . layout . status _ notification ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i : ĠInt Ġin Ġ 0 .. 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres ID Ġ= Ġresources . getIdentifier (" status $ i ", Ġ" id ", ĠpackageName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġstatus . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . set ImageView Resource ( res ID , Ġstatus [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . setView Visibility ( res ID , ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . setView Visibility ( res ID , ĠView . IN VISIBLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( status . size Ġ> Ġ 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . setView Visibility ( R . id . etc , ĠView . VISIBLE ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent View . setView Visibility ( R . id . etc , ĠView . IN VISIBLE ) ĊĠĠĠĠĠĠĠ Ġs nb . setContent ( content View ) ĊĠĠĠĠĠĠĠ Ġnm . notify ( STATUS _ NOTIFICATION _ ID , Ġs nb . build ()) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġrequest Audio Focus ( stream Type : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ&& Ġ( audio Focus Request Ġ== Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Target Api ( 2 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus Request Ġ= ĠAudio Focus Request . Builder ( Audio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ EXCL USIVE ). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Audio Attributes ( Audio Attributes . Builder (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Legacy Stream Type ( stream Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Target Api ( 2 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . request Audio Focus ( audio Focus Request !! ) Ġ== ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġgranted Ġfor Ġstream Ġ$ stream Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Bluetooth Head set Connected () Ġ&& Ġ! am . is Bluetooth S co On ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Starting ĠBluetooth ĠS co ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . start Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġdenied ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus Request Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . request Audio Focus ( null , Ġstream Type , ĠAudio Manager . AUDIO FOCUS _ GAIN _ TRAN SI ENT _ EXCL USIVE ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġgranted Ġfor Ġstream Ġ$ stream Type ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Bluetooth Head set Connected () Ġ&& Ġ! am . is Bluetooth S co On ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġam . start Bluetooth S co () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focused Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġdenied ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Bluetooth Head set Connected (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( bt Adapter Ġ!= Ġnull ) Ġ&& Ġbt Adapter . isEnabled Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( bt Adapter . get Profile Connection State ( Bluetooth Head set . HEAD SET ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBluetooth Head set . STATE _ CONNECTED ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Audio Focused (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaudio Focus Request Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġaudio Focused ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġaband on Audio Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Focus Request Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . ab and on Audio Focus Request ( audio Focus Request !! ) Ġ== ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġaband oned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focus Request Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Failed Ġto Ġaband on Ġaudio Ġfocus ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( audio Focused ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( am . ab and on Audio Focus ( null ) Ġ== ĠAudio Manager . AUDIO FOCUS _ REQUEST _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Audio Ġfocus Ġaband oned ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudio Focused Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Failed Ġto Ġaband on Ġaudio Ġfocus ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Ring ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġam . mode Ġ= ĠAudio Manager . MODE _ RING T ONE ĊĠĠĠĠĠĠĠ Ġrequest Audio Focus ( Audio Manager . STREAM _ RING ) ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 8 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt . is Loop ing Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt . play () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt . play () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt Timer Ġ= ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt Timer !!. schedule At Fixed Rate ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! rt . is Playing ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrt . play () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 0 Ġ* Ġ 1 , Ġ 1 0 0 0 Ġ* Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstop Ring ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( am . mode Ġ== ĠAudio Manager . MODE _ RING T ONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( Build . VERSION . SDK _ INT Ġ< Ġ 2 8 ) Ġ&& Ġ( rt Timer Ġ!= Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrt Timer !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrt Timer Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrt . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Call Volume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Volume Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig Call Volume Ġ= Ġam . get Stream Volume ( am . mode ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġam . set Stream Volume ( am . mode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( call Volume Ġ* Ġ 0 . 1 Ġ* Ġam . get Stream Max Volume ( am . mode )). round ToInt (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Original / new Ġcall Ġvolume Ġof Ġstream Ġ${ am . mode } Ġis Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ orig Call Volume /${ am . get Stream Volume ( am . mode )} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreset Call Volume () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( orig Call Volume Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġam . set Stream Volume ( am . mode , Ġorig Call Volume , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorig Call Volume Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Call Ġvolume Ġof Ġstream Ġ${ am . mode } Ġis Ġ${ am . get Stream Volume ( am . mode )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprox imity S ensing ( enable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( enable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! prox imity Wake Lock . is Hel d ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Ac qu iring Ġprox imity Ġwake Ġlock ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity Wake Lock . acquire () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Prox imity Ġwake Ġlock Ġalready Ġacquired ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prox imity Wake Lock . is Hel d ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity Wake Lock . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Released Ġprox imity Ġwake Ġlock ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Prox imity Ġwake Ġlock Ġis Ġnot Ġheld ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclean Service () Ġ{ ĊĠĠĠĠĠĠĠ Ġu as . clear () ĊĠĠĠĠĠĠĠ Ġstatus . clear () ĊĠĠĠĠĠĠĠ Ġcall History . clear () ĊĠĠĠĠĠĠĠ Ġmessages . clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: nm . isInitialized ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnm . cancel All () ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: partial Wake Lock . isInitialized Ġ&& Ġpartial Wake Lock . is Hel d ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpartial Wake Lock . release () ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: prox imity Wake Lock . isInitialized Ġ&& Ġprox imity Wake Lock . is Hel d ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprox imity Wake Lock . release () ĊĠĠĠĠĠĠĠ Ġif Ġ( this :: fl . isInitialized Ġ&& Ġfl . is Hel d ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfl . release () ĊĠĠĠĠĠĠĠ Ġis Service Clean Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġexternal Ġfun Ġb ares ip Start ( path : ĠString , Ġip V 4 Addr : ĠString , Ġip V 6 Addr : ĠString , Ġprefer Ip V 6 : ĠBoolean ) ĊĠĠĠ Ġexternal Ġfun Ġb ares ip Stop ( force : ĠBoolean ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠSTATUS _ NOTIFICATION _ ID Ġ= Ġ 1 0 1 ĊĠĠĠĠĠĠĠ Ġval ĠCALL _ NOTIFICATION _ ID Ġ= Ġ 1 0 2 ĊĠĠĠĠĠĠĠ Ġval ĠTRANS FER _ NOTIFICATION _ ID Ġ= Ġ 1 0 3 ĊĠĠĠĠĠĠĠ Ġval ĠMESSAGE _ NOTIFICATION _ ID Ġ= Ġ 1 0 4 ĊĊĠĠĠĠĠĠĠ Ġval ĠSTATUS _ REQ _ CODE Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval ĠCALL _ REQ _ CODE Ġ= Ġ 2 ĊĠĠĠĠĠĠĠ Ġval ĠAN SW ER _ REQ _ CODE Ġ= Ġ 3 ĊĠĠĠĠĠĠĠ Ġval ĠRE JECT _ REQ _ CODE Ġ= Ġ 4 ĊĠĠĠĠĠĠĠ Ġval ĠTRANS FER _ REQ _ CODE Ġ= Ġ 5 ĊĠĠĠĠĠĠĠ Ġval ĠAC CEPT _ REQ _ CODE Ġ= Ġ 6 ĊĠĠĠĠĠĠĠ Ġval ĠD EN Y _ REQ _ CODE Ġ= Ġ 7 ĊĠĠĠĠĠĠĠ Ġval ĠMESSAGE _ REQ _ CODE Ġ= Ġ 8 ĊĠĠĠĠĠĠĠ Ġval ĠRE PLY _ REQ _ CODE Ġ= Ġ 9 ĊĠĠĠĠĠĠĠ Ġval ĠSAVE _ REQ _ CODE Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval ĠDELETE _ REQ _ CODE Ġ= Ġ 1 1 ĊĊĠĠĠĠĠĠĠ Ġval ĠDEFAULT _ CHANNEL _ ID Ġ= Ġ" com . tut pro . ba res ip . default " ĊĠĠĠĠĠĠĠ Ġval ĠHIGH _ CHANNEL _ ID Ġ= Ġ" com . tut pro . ba res ip . high " ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Service Running Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġlibrary Loaded Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġis Service Clean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġspeaker Phone Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġcall Volume Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġdyn Dns Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġprefer Ip V 6 Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġfiles Path Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġdownloads Path Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġval Ġu as Ġ= ĠArrayList < UserAgent >() ĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= ĠArrayList < Int >() ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= ĠArrayList < Call >() ĊĠĠĠĠĠĠĠ Ġvar Ġcall History Ġ= ĠArrayList < Call History >() ĊĠĠĠĠĠĠĠ Ġvar Ġmessages Ġ= ĠArrayList < Message >() ĊĠĠĠĠĠĠĠ Ġval Ġcontacts Ġ= ĠArrayList < Contact >() ĊĠĠĠĠĠĠĠ Ġval Ġchat Texts : ĠMutable Map < String , ĠString > Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠĠĠĠĠ Ġval Ġactivities Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġvar Ġdns Servers Ġ= ĠlistOf < Inet Address >() ĊĠĠĠĠĠĠĠ Ġvar Ġlink Addresses Ġ= ĠlistOf < Link Address >() ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! library Loaded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( LOG _ TAG , Ġ" Loading Ġb ares ip Ġlibrary ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . load Library (" ba res ip ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlibrary Loaded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ