Skip to content

Commit 6071b5d

Browse files
committed
Remove notification on disconnect
1 parent 99a5ef9 commit 6071b5d

File tree

2 files changed

+61
-29
lines changed

2 files changed

+61
-29
lines changed

extendedSample/src/main/java/info/mqtt/android/extsample/internal/MqttCallbackHandler.kt

+6-5
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ internal class MqttCallbackHandler(private val context: Context, private val cli
1818
val connection = getInstance(context).getConnection(clientHandle)
1919
connection?.addHistory("Connection Lost")
2020
connection?.changeConnectionStatus(Connection.ConnectionStatus.DISCONNECTED)
21+
cause?.let {
22+
val intent = Intent()
23+
intent.setClassName(context, activityClass)
24+
intent.putExtra("handle", clientHandle)
2125

22-
val intent = Intent()
23-
intent.setClassName(context, activityClass)
24-
intent.putExtra("handle", clientHandle)
25-
26-
notification(context, "id=${connection?.id} host=${connection?.hostName}", intent, R.string.notifyTitle_connectionLost)
26+
notification(context, "id=${connection?.id} host=${connection?.hostName}", intent, R.string.notifyTitle_connectionLost)
27+
}
2728
}
2829

2930
@Throws(Exception::class)

serviceLibrary/src/main/java/info/mqtt/android/service/MqttAndroidClient.kt

+55-24
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package info.mqtt.android.service
22

3+
import android.app.ActivityManager
34
import android.app.Notification
45
import android.content.*
56
import android.os.Build
@@ -40,7 +41,8 @@ import javax.net.ssl.TrustManagerFactory
4041
*/
4142
class MqttAndroidClient @JvmOverloads constructor(
4243
val context: Context, private val serverURI: String, private val clientId: String, ackType: Ack = Ack.AUTO_ACK,
43-
private var persistence: MqttClientPersistence? = null) :
44+
private var persistence: MqttClientPersistence? = null
45+
) :
4446
BroadcastReceiver(), IMqttAsyncClient {
4547

4648
// Listener for when the service is connected or disconnected
@@ -195,7 +197,13 @@ class MqttAndroidClient @JvmOverloads constructor(
195197
* The actual connection depends on the service, which we start and bind to here, but which we can't actually use until the serviceConnection
196198
* onServiceConnected() method has run (asynchronously), so the connection itself takes place in the onServiceConnected() method
197199
*/
198-
if (mqttService == null) { // First time - must bind to the service
200+
val isRunning = isMqServiceRunning()
201+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
202+
Timber.d("isRunning=$isRunning ${mqttService?.connections?.size} foregroundServiceType=${mqttService?.foregroundServiceType}")
203+
} else
204+
Timber.d("isRunning=$isRunning ${mqttService?.connections?.size}")
205+
206+
if (mqttService == null || mqttService?.connections?.size == 0) { // First time - must bind to the service
199207
val serviceStartIntent = Intent()
200208
serviceStartIntent.setClassName(context, SERVICE_NAME)
201209
var service: Any? = null
@@ -235,6 +243,12 @@ class MqttAndroidClient @JvmOverloads constructor(
235243
return token
236244
}
237245

246+
private fun isMqServiceRunning(): Boolean {
247+
val manager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
248+
return manager.getRunningServices(Integer.MAX_VALUE)
249+
.any { it.service.className == SERVICE_NAME }
250+
}
251+
238252
private fun registerReceiver(receiver: BroadcastReceiver) {
239253
val filter = IntentFilter()
240254
filter.addAction(MqttServiceConstants.CALLBACK_TO_ACTIVITY)
@@ -247,13 +261,13 @@ class MqttAndroidClient @JvmOverloads constructor(
247261
*/
248262
private fun doConnect() {
249263
if (clientHandle == null) {
250-
clientHandle = mqttService!!.getClient(serverURI, clientId, context.applicationInfo.packageName, persistence)
264+
clientHandle = mqttService?.getClient(serverURI, clientId, context.applicationInfo.packageName, persistence)
251265
}
252-
mqttService!!.isTraceEnabled = traceEnabled
253-
mqttService!!.setTraceCallbackId(clientHandle)
266+
mqttService?.isTraceEnabled = traceEnabled
267+
mqttService?.setTraceCallbackId(clientHandle)
254268
val activityToken = storeToken(connectToken)
255269
try {
256-
mqttService!!.connect(clientHandle!!, clientConnectOptions, activityToken)
270+
mqttService?.connect(clientHandle!!, clientConnectOptions, activityToken)
257271
} catch (e: Exception) {
258272
val listener = connectToken!!.actionCallback
259273
listener?.onFailure(connectToken, e)
@@ -271,9 +285,26 @@ class MqttAndroidClient @JvmOverloads constructor(
271285
* @see .disconnect
272286
*/
273287
override fun disconnect(): IMqttToken {
288+
val isRunning = isMqServiceRunning()
289+
Timber.d("isRunning=$isRunning ${mqttService?.connections?.size}")
290+
274291
val token: IMqttToken = MqttTokenAndroid(this, null, null)
275292
val activityToken = storeToken(token)
276-
mqttService!!.disconnect(clientHandle!!, null, activityToken)
293+
clientHandle?.let {
294+
mqttService?.disconnect(it, null, activityToken)
295+
}
296+
297+
// if there are no more connections, we can shutdown the service
298+
if (mqttService?.connections?.isEmpty() == true) {
299+
Timber.d("Shutdown service")
300+
// For < Android O this should work (untested)
301+
val myService = Intent(context, MqttService::class.java)
302+
context.stopService(myService)
303+
// For Android O it's probably enough
304+
mqttService!!.stopForeground(true)
305+
306+
//unregisterResources()
307+
}
277308
return token
278309
}
279310

@@ -293,7 +324,7 @@ class MqttAndroidClient @JvmOverloads constructor(
293324
override fun disconnect(quiesceTimeout: Long): IMqttToken {
294325
val token: IMqttToken = MqttTokenAndroid(this, null, null)
295326
val activityToken = storeToken(token)
296-
mqttService!!.disconnect(clientHandle!!, quiesceTimeout, null, activityToken)
327+
mqttService?.disconnect(clientHandle!!, quiesceTimeout, null, activityToken)
297328
return token
298329
}
299330

@@ -311,7 +342,7 @@ class MqttAndroidClient @JvmOverloads constructor(
311342
override fun disconnect(userContext: Any?, callback: IMqttActionListener?): IMqttToken {
312343
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback)
313344
val activityToken = storeToken(token)
314-
mqttService!!.disconnect(clientHandle!!, null, activityToken)
345+
mqttService?.disconnect(clientHandle!!, null, activityToken)
315346
return token
316347
}
317348

@@ -345,7 +376,7 @@ class MqttAndroidClient @JvmOverloads constructor(
345376
override fun disconnect(quiesceTimeout: Long, userContext: Any?, callback: IMqttActionListener): IMqttToken {
346377
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback)
347378
val activityToken = storeToken(token)
348-
mqttService!!.disconnect(clientHandle!!, quiesceTimeout, null, activityToken)
379+
mqttService?.disconnect(clientHandle!!, quiesceTimeout, null, activityToken)
349380
return token
350381
}
351382

@@ -406,7 +437,7 @@ class MqttAndroidClient @JvmOverloads constructor(
406437
message.isRetained = retained
407438
val token = MqttDeliveryTokenAndroid(this, userContext, callback, message)
408439
val activityToken = storeToken(token)
409-
val internalToken = mqttService!!.publish(clientHandle!!, topic, payload, QoS.valueOf(qos), retained, null, activityToken)
440+
val internalToken = mqttService?.publish(clientHandle!!, topic, payload, QoS.valueOf(qos), retained, null, activityToken)
410441
token.setDelegate(internalToken)
411442
return token
412443
}
@@ -468,7 +499,7 @@ class MqttAndroidClient @JvmOverloads constructor(
468499
override fun publish(topic: String, message: MqttMessage, userContext: Any?, callback: IMqttActionListener?): IMqttDeliveryToken {
469500
val token = MqttDeliveryTokenAndroid(this, userContext, callback, message)
470501
val activityToken = storeToken(token)
471-
val internalToken = mqttService!!.publish(clientHandle!!, topic, message, null, activityToken)
502+
val internalToken = mqttService?.publish(clientHandle!!, topic, message, null, activityToken)
472503
token.setDelegate(internalToken)
473504
return token
474505
}
@@ -520,7 +551,7 @@ class MqttAndroidClient @JvmOverloads constructor(
520551
override fun subscribe(topic: String, qos: Int, userContext: Any?, callback: IMqttActionListener?): IMqttToken {
521552
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback, arrayOf(topic))
522553
val activityToken = storeToken(token)
523-
mqttService!!.subscribe(clientHandle!!, topic, QoS.valueOf(qos), null, activityToken)
554+
mqttService?.subscribe(clientHandle!!, topic, QoS.valueOf(qos), null, activityToken)
524555
return token
525556
}
526557

@@ -624,7 +655,7 @@ class MqttAndroidClient @JvmOverloads constructor(
624655
override fun subscribe(topic: Array<String>, qos: IntArray, userContext: Any?, callback: IMqttActionListener?): IMqttToken {
625656
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback, topic)
626657
val activityToken = storeToken(token)
627-
mqttService!!.subscribe(clientHandle!!, topic, qos, null, activityToken)
658+
mqttService?.subscribe(clientHandle!!, topic, qos, null, activityToken)
628659
return token
629660
}
630661

@@ -703,7 +734,7 @@ class MqttAndroidClient @JvmOverloads constructor(
703734
): IMqttToken {
704735
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback, topicFilters)
705736
val activityToken = storeToken(token)
706-
mqttService!!.subscribe(clientHandle!!, topicFilters, qos.map { QoS.valueOf(it) }.toTypedArray(), null, activityToken, messageListeners)
737+
mqttService?.subscribe(clientHandle!!, topicFilters, qos.map { QoS.valueOf(it) }.toTypedArray(), null, activityToken, messageListeners)
707738
return token
708739
}
709740

@@ -741,7 +772,7 @@ class MqttAndroidClient @JvmOverloads constructor(
741772
override fun unsubscribe(topic: String, userContext: Any?, callback: IMqttActionListener?): IMqttToken {
742773
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback)
743774
val activityToken = storeToken(token)
744-
mqttService!!.unsubscribe(clientHandle!!, topic, null, activityToken)
775+
mqttService?.unsubscribe(clientHandle!!, topic, null, activityToken)
745776
return token
746777
}
747778

@@ -772,7 +803,7 @@ class MqttAndroidClient @JvmOverloads constructor(
772803
override fun unsubscribe(topic: Array<String>, userContext: Any?, callback: IMqttActionListener?): IMqttToken {
773804
val token: IMqttToken = MqttTokenAndroid(this, userContext, callback)
774805
val activityToken = storeToken(token)
775-
mqttService!!.unsubscribe(clientHandle!!, topic, null, activityToken)
806+
mqttService?.unsubscribe(clientHandle!!, topic, null, activityToken)
776807
return token
777808
}
778809

@@ -903,7 +934,7 @@ class MqttAndroidClient @JvmOverloads constructor(
903934
} else if (MqttServiceConstants.TRACE_ACTION == action) {
904935
traceAction(data)
905936
} else {
906-
mqttService!!.traceError("Callback action doesn't exist.")
937+
mqttService?.traceError("Callback action doesn't exist.")
907938
}
908939
}
909940

@@ -918,7 +949,7 @@ class MqttAndroidClient @JvmOverloads constructor(
918949
*/
919950
fun acknowledgeMessage(messageId: String): Boolean {
920951
if (messageAck == Ack.MANUAL_ACK) {
921-
val status = mqttService!!.acknowledgeMessageArrival(clientHandle!!, messageId)
952+
val status = mqttService?.acknowledgeMessageArrival(clientHandle!!, messageId)
922953
return status == Status.OK
923954
}
924955
return false
@@ -1008,7 +1039,7 @@ class MqttAndroidClient @JvmOverloads constructor(
10081039
(token as MqttTokenAndroid).notifyFailure(exceptionThrown)
10091040
}
10101041
} else {
1011-
mqttService!!.traceError("simpleAction : token is null")
1042+
mqttService?.traceError("simpleAction : token is null")
10121043
}
10131044
}
10141045

@@ -1066,15 +1097,15 @@ class MqttAndroidClient @JvmOverloads constructor(
10661097
callbacksList.forEach { callback ->
10671098
callback.messageArrived(destinationName, message)
10681099
}
1069-
mqttService!!.acknowledgeMessageArrival(clientHandle!!, messageId)
1100+
mqttService?.acknowledgeMessageArrival(clientHandle!!, messageId)
10701101
} else {
10711102
message.messageId = messageId
10721103
callbacksList.forEach { callback ->
10731104
callback.messageArrived(destinationName, message)
10741105
}
10751106
}
10761107
} catch (e: Exception) {
1077-
mqttService!!.traceError("messageArrivedAction failed: $e")
1108+
mqttService?.traceError("messageArrivedAction failed: $e")
10781109
}
10791110
}
10801111

@@ -1157,7 +1188,7 @@ class MqttAndroidClient @JvmOverloads constructor(
11571188
* @param bufferOpts the DisconnectedBufferOptions
11581189
*/
11591190
override fun setBufferOpts(bufferOpts: DisconnectedBufferOptions) {
1160-
mqttService!!.setBufferOpts(clientHandle!!, bufferOpts)
1191+
mqttService?.setBufferOpts(clientHandle!!, bufferOpts)
11611192
}
11621193

11631194
override fun getBufferedMessageCount(): Int {
@@ -1169,7 +1200,7 @@ class MqttAndroidClient @JvmOverloads constructor(
11691200
}
11701201

11711202
override fun deleteBufferedMessage(bufferIndex: Int) {
1172-
mqttService!!.deleteBufferedMessage(clientHandle!!, bufferIndex)
1203+
mqttService?.deleteBufferedMessage(clientHandle!!, bufferIndex)
11731204
}
11741205

11751206
override fun getInFlightMessageCount() = 0

0 commit comments

Comments
 (0)