Skip to content

Commit 5b8b883

Browse files
committed
Fixed the 'Too many receivers, total of 1000, registered' bug
1 parent 5d204a3 commit 5b8b883

File tree

4 files changed

+41
-31
lines changed

4 files changed

+41
-31
lines changed

android/app/src/main/java/com/httpsms/FirebaseMessagingService.kt

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.httpsms
33
import android.app.PendingIntent
44
import android.content.Context
55
import android.content.Intent
6-
import android.content.IntentFilter
76
import androidx.work.*
87
import com.google.firebase.messaging.FirebaseMessagingService
98
import com.google.firebase.messaging.RemoteMessage
@@ -140,15 +139,13 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
140139

141140
val parts = getMessageParts(applicationContext, message)
142141
if (parts.size == 1) {
143-
return handleSingleMessage(applicationContext, message)
142+
return handleSingleMessage(message)
144143
}
145-
return handleMultipartMessage(applicationContext, message, parts)
144+
return handleMultipartMessage(message, parts)
146145
}
147146

148-
private fun handleMultipartMessage(context: Context, message:Message, parts: ArrayList<String>): Result {
149-
registerReceivers(context, message.id)
150-
151-
Timber.d("sending SMS for message with ID [${message.id}]")
147+
private fun handleMultipartMessage(message:Message, parts: ArrayList<String>): Result {
148+
Timber.d("sending multipart SMS for message with ID [${message.id}]")
152149
return try {
153150
val sentIntents = ArrayList<PendingIntent>()
154151
val deliveredIntents = ArrayList<PendingIntent>()
@@ -162,8 +159,8 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
162159
id = message.id
163160
}
164161

165-
sentIntents.add(createPendingIntent(id, SmsManagerService.sentAction(id)))
166-
deliveredIntents.add(createPendingIntent(id, SmsManagerService.deliveredAction(id)))
162+
sentIntents.add(createPendingIntent(id, SmsManagerService.sentAction()))
163+
deliveredIntents.add(createPendingIntent(id, SmsManagerService.deliveredAction()))
167164
}
168165
SmsManagerService().sendMultipartMessage(this.applicationContext,message.contact, parts, message.sim, sentIntents, deliveredIntents)
169166
Timber.d("sent SMS for message with ID [${message.id}] in [${parts.size}] parts")
@@ -176,27 +173,15 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
176173
}
177174

178175

179-
private fun handleSingleMessage(context: Context, message:Message): Result {
180-
registerReceivers(context, message.id)
176+
private fun handleSingleMessage(message:Message): Result {
181177
sendMessage(
182178
message,
183-
createPendingIntent(message.id, SmsManagerService.sentAction(message.id)),
184-
createPendingIntent(message.id, SmsManagerService.deliveredAction(message.id))
179+
createPendingIntent(message.id, SmsManagerService.sentAction()),
180+
createPendingIntent(message.id, SmsManagerService.deliveredAction())
185181
)
186182
return Result.success()
187183
}
188184

189-
private fun registerReceivers(context: Context, messageID: String) {
190-
context.registerReceiver(
191-
SentReceiver(),
192-
IntentFilter(SmsManagerService.sentAction(messageID))
193-
)
194-
context.registerReceiver(
195-
DeliveredReceiver(),
196-
IntentFilter(SmsManagerService.deliveredAction(messageID))
197-
)
198-
}
199-
200185
private fun handleFailed(context: Context, messageID: String) {
201186
Timber.d("sending failed event for message with ID [${messageID}]")
202187
HttpSmsApiService.create(context)
@@ -249,9 +234,9 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
249234

250235
return PendingIntent.getBroadcast(
251236
this.applicationContext,
252-
0,
237+
id.hashCode(),
253238
intent,
254-
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
239+
PendingIntent.FLAG_MUTABLE
255240
)
256241
}
257242
}

android/app/src/main/java/com/httpsms/MainActivity.kt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.app.NotificationChannel
66
import android.app.NotificationManager
77
import android.content.Context
88
import android.content.Intent
9+
import android.content.IntentFilter
910
import android.net.Uri
1011
import android.os.Build
1112
import android.os.Bundle
@@ -41,6 +42,9 @@ import android.provider.Settings as ProviderSettings
4142

4243

4344
class MainActivity : AppCompatActivity() {
45+
private var sentReceiver: SentReceiver? = null
46+
private var deliveredReceiver: DeliveredReceiver? = null
47+
4448
override fun onCreate(savedInstanceState: Bundle?) {
4549
super.onCreate(savedInstanceState)
4650

@@ -55,6 +59,7 @@ class MainActivity : AppCompatActivity() {
5559
setCardContent(this)
5660
registerListeners()
5761
refreshToken(this)
62+
registerReceivers(this)
5863

5964
startStickyNotification(this)
6065
scheduleHeartbeatWorker(this)
@@ -82,6 +87,26 @@ class MainActivity : AppCompatActivity() {
8287
appVersionView.text = format(getString(R.string.app_version), BuildConfig.VERSION_NAME)
8388
}
8489

90+
private fun registerReceivers(context: Context) {
91+
if(sentReceiver == null) {
92+
Timber.d("registering [sent] receiver for intent [${SmsManagerService.sentAction()}]")
93+
sentReceiver = SentReceiver()
94+
context.registerReceiver(
95+
sentReceiver,
96+
IntentFilter(SmsManagerService.sentAction())
97+
)
98+
}
99+
100+
if(deliveredReceiver == null) {
101+
Timber.d("registering [delivered] receiver for intent [${SmsManagerService.deliveredAction()}]")
102+
deliveredReceiver = DeliveredReceiver()
103+
context.registerReceiver(
104+
deliveredReceiver,
105+
IntentFilter(SmsManagerService.deliveredAction())
106+
)
107+
}
108+
}
109+
85110
private fun setCardContent(context: Context) {
86111
val titleText = findViewById<TextView>(R.id.cardPhoneNumber)
87112
titleText.text = PhoneNumberUtils.formatNumber(Settings.getSIM1PhoneNumber(this), Locale.getDefault().country)

android/app/src/main/java/com/httpsms/SmsManagerService.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ class SmsManagerService {
1717
private const val ACTION_SMS_SENT = "SMS_SENT"
1818
private const val ACTION_SMS_DELIVERED = "SMS_DELIVERED"
1919

20-
fun sentAction(messageID: String): String {
21-
return "$ACTION_SMS_SENT.$messageID"
20+
fun sentAction(): String {
21+
return "${BuildConfig.APPLICATION_ID}.$ACTION_SMS_SENT"
2222
}
2323

24-
fun deliveredAction(messageID: String): String {
25-
return "$ACTION_SMS_DELIVERED.$messageID"
24+
fun deliveredAction(): String {
25+
return "${BuildConfig.APPLICATION_ID}.$ACTION_SMS_DELIVERED"
2626
}
2727

2828
fun isDualSIM(context: Context) : Boolean {

api/cmd/experiments/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func main() {
2323

2424
func loadTest() {
2525
wg := sync.WaitGroup{}
26-
for i := 0; i < 1; i++ {
26+
for i := 0; i < 2; i++ {
2727
wg.Add(1)
2828
go func(count int) {
2929
sendSMS(count)

0 commit comments

Comments
 (0)